Tengo la cadena de prueba ti: harry Potter O kw: magia Y sprint: título O ti: HARRY
y quiero la salida como
["ti: harry Potter OR kw:", "kw: magic AND sprint:", "sprint: title OR ti:", "ti: HARRY"]pero la salida que obtengo es
["ti: harry Potter OR kw:", "kw: magic AND sprint:", "nt: title OR ti:", "ti: HARRY"]Está tomando solo 2 caracteres antes de los dos puntos. La expresión regular que estoy usando es
const match = /[a-z0-9]{2}:.*?($|[a-z0-9]{2}:)/g;y lo extraigo y lo coloco en una matriz
Intenté reemplazarlo con /[a-z0-9]+:.*?($|[a-z0-9]+:)/g; pero cuando aumento el índice y agrego las cadenas para analizar, lo hace de manera extraña (esto también está incluido en el código)
Intenté cambiar el {2} a n y eso tampoco funciona como se esperaba.
const parsed = []; const match = /[a-z0-9]{2}:.*?($|[a-z0-9]{2}:)/g; const message = "ti: harry Potter OR kw: magic AND sprint: title OR ti: HARRY"; let next = match.exec(message); while (next) { parsed.push(next[0]); match.lastIndex = next.index + 1; next = match.exec(message); console.log("next again", next); } console.log("parsed", parsed);https://codesandbox.io/s/regex-forked-6op514?file=/src/index.js
Para las coincidencias deseadas, puede usar un patrón en el que, opcionalmente, también haría coincidir AND u OR y obtendría la coincidencia en el grupo de captura 1, que se indica como m[1] en el código de ejemplo.
\b(?=([a-z0-9]+:.*?(?: (?:AND|OR) [a-z0-9]+:|$)))En partes, el patrón coincide:
\b Un límite de palabra para evitar una coincidencia parcial(?= Anticipación positiva para afirmar que lo que está a la derecha es( Grupo de captura 1[a-z0-9]+:.*? Haga coincidir cualquier carácter excepto una nueva línea lo menos posible(?: grupo de no captura(?:AND|OR) [a-z0-9]+: coincide con AND u OR seguido de un espacio y 1+ veces un carácter a-z0-9 y :| O$ Afirmar el final de la cadena) Cerrar grupo de no captura) Cerrar grupo 1) Cerrar la búsqueda anticipadaVea una demostración de expresiones regulares .
const regex = /\b(?=([a-z0-9]+:.*?(?: (?:AND|OR) [a-z0-9]+:|$)))/gm; const str = `ti: harry Potter OR kw: magic AND sprint: title OR ti: HARRY`; const result = Array.from(str.matchAll(regex), m => m[1]); console.log(result);