Estoy tratando de convertir una lista numerada en una matriz de elementos. Esto es lo que tengo hasta ahora:
let input = `1. This is a text\n where each item can span over multiple lines\n 1.1 this is another item\n 1.2another item\n 2. that I want to\n extract each seperate\n item from\n 3. How can I do that?`; let regex = /(\d+\.\d+|\d+)\s(.*)/g; let matches = input.match(regex); console.log(matches);Esto solo produce el siguiente resultado:
"1.1 this is another item"Lo que me gustaría es algo como esto:
"1. This is a text" "1.1 this is another item" "1.2another item" ...and so on¿Por qué coincide solo con un elemento de esta cadena? ¿Qué estoy haciendo mal y cómo puedo solucionarlo?
Su expresión regular no prevé un punto después de un número cuando no hay un segundo número siguiéndolo. También requiere un espacio después del número, pero tiene un caso en el que no hay tal espacio. Así que hazlo opcional.
Además, use el s modificado para que . también coincide con la nueva línea cha
Si un elemento nuevo puede comenzar en la misma línea, necesitará mirar hacia adelante para prever dónde debe terminar una coincidencia.
Corrección:
let input = `1. This is a text\n where each item can span over multiple lines\n 1.1 this is another item\n 1.2another item\n 2. that I want to\n extract each seperate\n item from\n 3. How can I do that?`; let regex = /(\d+\.\d*)\s?(.*?)(?=\d+\.|$)/gs; let matches = input.match(regex); console.log(matches);Otra opción usando una clase de carácter negado:
\b\d+\.\D*(?:\d(?!\.)[^.]*)*Explicación
\b\d+\.\ Un límite de palabra, coincide con 1+ dígitos y un punto\D* Opcionalmente emparejar no dígitos(?:\d(?!\.)[^.]*)* Opcionalmente, haga coincidir un dígito afirmando que no es un punto directamente a la derechaDemostración de expresiones regulares
let input = `1. This is a text\n where each item can span over multiple lines\n 1.1 this is another item\n 1.2another item\n 2. that I want to\n extract each seperate\n item from\n 3. How can I do that?`; let regex = /\b\d+\.\D*(?:\d(?!\.)[^.]*)*/g; let matches = input.match(regex); console.log(matches);Si desea tener en cuenta el inicio de la cadena donde comienzan los dígitos y el punto, puede seguir la coincidencia afirmando que no hay un patrón de dígitos y puntos al comienzo de la cadena:
^[^\S\n]*\d+\..*(?:\n(?![^\S\n]*\d+\.).*)*Demostración de expresiones regulares
let input = "1. This is a text with a number 1.2 and 3.\n where each item can span over multiple lines\n 1.1 this is another item\n 1.2another item\n 2. that I want to\n extract each seperate\n item from\n 3. How can I do that?"; let regex = /^[^\S\n]*\d+\..*(?:\n(?![^\S\n]*\d+\.).*)*/gm; let matches = input.match(regex).map(s => s.trim()); console.log(matches);