Tengo estas tres declaraciones de expresiones regulares y estoy usando Javascript
/(?<=[AND])\s?\[(.*?)\]/ /(?<=[OR])\s?\[(.*?)\]/ /(?<=[NOT])\s?\[(.*?)\]/ dada una cadena como -> AND [thing1, thing2, thing3] OR [thing4, thing5] NOT [thing6] Espero que las coincidencias de los patrones regresen en orden
thing1, thing2, thing3 thing4, thing5 thing6 Cuando un usuario ingresa una cadena como esta -> AND [thing1, thing2, thing3 OR [thing4, thing5] el primer patrón regresa
thing1, thing2, thing3 OR [thing4, thing5 Estoy tratando de averiguar cómo evitar que la expresión regular coincida cuando hay una palabra clave booleana presente antes de un paréntesis de cierre. He intentado perder el tiempo agregando [^NOT]|[^OR] ^NOT|^OR en el grupo de captura, pero nada de lo que he hecho funciona bien (regex newb aquí).
Además, si hay otros errores potencialmente obvios con mi expresión regular actual, indíquelos.
Editar: Perdón a todos por la respuesta lenta, me tomó un poco de tiempo descifrar lo que están haciendo sus expresiones regulares. Gracias por la información sobre los corchetes que capturan grupos, veo lo que estaba haciendo mal de antemano.
¿Por qué no combinar cada uno de estos patrones en un solo grupo coincidente? Parece que tiene algunos conceptos erróneos fundamentales, específicamente con respecto al uso de corchetes ( [] ) en su patrón.
No está claro por qué eligió incluir sus tokens lógicos en estos corchetes: en RegExp, estos se usan específicamente para denotar juegos de caracteres . La forma en que expresaste esto en tu patrón original coincide literalmente con uno de los dos o tres caracteres del conjunto, y no con la palabra completa (como parece ser tu intención). También parece haber sido víctima del mismo concepto erróneo en su intento de incluir estas fichas lógicas en el último grupo de su patrón.
En su lugar, use alternativas (denotadas por barras verticales | ) correctamente:
const test1 = `AND [thing1, thing2, thing3] OR [thing4, thing5] NOT [thing6]`; const test2 = `AND [thing1, thing2, thing3 OR [thing4, thing5]`; const pattern = /(?<=AND|OR|NOT)(?:\s?)\[(.*?)(?:\]|\s(AND|OR|NOT))/g; console.log([...test1.matchAll(pattern)].map(match => match[1])); console.log([...test2.matchAll(pattern)].map(match => match[1]));Dado que es nuevo en JavaScript, le recomiendo usar una utilidad como regex101 para crear sus patrones; de forma predeterminada, un panel en el lado derecho de la ventana explica, en lenguaje sencillo, lo que realmente hace cada parte de su patrón. , que puede comparar con lo que espera que haga y ajustar en consecuencia.
[AND] significa una clase de carácter y coincide con un solo carácter A N D[^NOT] significa una clase de carácter negado que coincide con cualquier carácter individual excepto N O T^NOT|^OR significa hacer coincidir NOT u OR al comienzo de la cadena Si desea 3 alternativas, puede hacerlo usando una alternancia en un grupo (?:AND|OR|NOT)
Usando Javascript, puede afirmar que entre el corchete de apertura y cierre no hay Y O NO
(?<=(?:AND|OR|NOT)\s?\[)(?![^\][]*\b(?:AND|OR|NOT)\b)[^\][]*(?=\])(?<=(?:AND|OR|NOT)\s?\[) Positivo mirar atrás, afirmar cualquiera de las alternativas a la izquierda(?![^\][]*\b(?:AND|OR|NOT)\b) Anticipación negativa para afirmar ninguna de las alternativas antes de ninguno de los corchetes[^\][]* Coincidencia de caracteres opcionales que no sean [ y ](?=\]) Anticipación positiva, afirmar ] a la derecha