Esto es lo que me gustaría poder hacer:
function convertVersionToNumber(line) { const groups = line.matchAll(/^# ([0-9]).([0-9][0-9]).([0-9][0-9])\s*/g); return parseInt(groups[1] + groups[2] + groups[3]); } convertVersionToNumber("# 1.03.00") Esto no funciona porque groups son un IterableIterator<RegExpMatchArray> , no una matriz. Array.from tampoco parece convertirlo en una matriz de grupos. ¿Hay alguna manera fácil (idealmente algo que pueda caber en una sola línea) que pueda convertir groups en una matriz?
La API de ese IterableIterator<RegExpMatchArray> es un poco inconveniente y no sé cómo omitir el primer elemento en un for...of . Quiero decir, sé cómo usar ambos, parece que agregará más de 4 líneas, así que me gustaría saber si hay una forma más concisa.
Estoy usando mecanografiado, así que si tiene algo de azúcar sintáctico para hacer esto, estaría feliz de usarlo.
1) matchAll devolverá un objeto Iterator Iterator Iterator [RegExp String Iterator]
El result contendrá un iterador y cuando use el operador de propagación le dará todas las coincidencias. Dado que contiene solo una coincidencia, contiene un solo elemento.
[ '# 1.03.00', '1', '03', '00', index: 0, input: '# 1.03.00', groups: undefined ]Finalmente, usamos un operador de propagación para obtener todo el valor y envolverlo en una matriz
[...result] function convertVersionToNumber(line) { const result = line.matchAll(/^# ([0-9]).([0-9][0-9]).([0-9][0-9])\s*/g); const groups = [...result][0]; return parseInt(groups[1] + groups[2] + groups[3]); } console.log(convertVersionToNumber("# 1.03.00")); Dado que está utilizando expresiones regulares, es decir /^# ([0-9]).([0-9][0-9]).([0-9][0-9])\s*/
2) Si hay varias coincidencias, puede distribuir los resultados en una matriz y luego usar for..of para recorrer las coincidencias.
function convertVersionToNumber(line) { const iterator = line.matchAll(/# ([0-9]).([0-9][0-9]).([0-9][0-9])\s*/g); const results = [...iterator]; for (let arr of results) { const [match, g1, g2, g3] = arr; console.log(match, g1, g2, g3); } } convertVersionToNumber("# 1.03.00 # 1.03.00");Solución alternativa: también puede obtener el mismo resultado usando una coincidencia simple
function convertVersionToNumber(line) { const result = line.match(/\d/g); return +result.join(""); } console.log(convertVersionToNumber("# 1.03.00"));No necesita .matchAll en este caso concreto. Simplemente desea hacer coincidir una cadena en un formato específico y volver a formatearla conservando solo las tres subcadenas capturadas.
Puedes hacerlo con .replace :
function convertVersionToNumber(line) { return parseInt(line.replace(/^# (\d)\.(\d{2})\.(\d{2})[\s\S]*/, '$1$2$3')); } console.log( convertVersionToNumber("# 1.03.00") );Puede verificar si la cadena antes de reemplazar es igual a la nueva cadena si necesita verificar si hubo una coincidencia.
Tenga en cuenta que debe escapar de los puntos para que coincidan como caracteres literales.
El patrón ^# (\d)\.(\d{2})\.(\d{2})[\s\S]* coincide con
^ - comienzo de la cadena# - espacio + #(\d) - Grupo 1: un dígito\. - un punto(\d{2}) - Grupo 2: dos dígitos\. - un punto(\d{2}) - Grupo 3: dos dígitos[\s\S]* - el resto de la cadena (cero o más caracteres, tantos como sea posible). El patrón de reemplazo $1$2$3 son los valores concatenados del Grupo 1, 2 y 3.