Estoy tratando de crear una expresión regular que coincida con todas las líneas con cierto PREFIJO y la coincidencia debería terminar cuando se encuentre un carácter ' Sin embargo, si hay un ? antes de ' , entonces no debería contarse como el final de la línea. Básicamente el signo de interrogación ? sirve como char de escape.
Esto es lo que he estado usando, pero no funciona para lo que intento hacer: Esta es la expresión regular /SOME_PREFIX+[^']+/
[EDITAR] Este es el texto esperado completo:
you could have something before'SOME_PREFIX foo bar'something in the middle'SOME_PREFIX BAR FOO ?'SHOULD ALSO MATCH'test'
SOME_PREFIX foo bar' <---Debería coincidir 1
SOME_PREFIX BAR FOO ?'SHOULD ALSO MATCH' <--- Debería ser una coincidencia 2, pero esta línea no funciona, ya que solo coincide hasta ?' que es la primera aparición de la '
Para referencia: https://regexr.com/63io9
Podrías usar, por ejemplo:
const text = "you could have something before'SOME_PREFIX foo bar'something in the middle'SOME_PREFIX BAR FOO ?'SHOULD ALSO MATCH'test'"; const matches = text.match(/SOME_PREFIX(?:[^'?]+|\?'?)*'/g); console.log(matches); [^'?]+ coincide con cualquier carácter que no sea un ' o ? , una o más veces, y \?'? significa coincidir con un ? seguido opcionalmente por un ' .
Una construcción de alternancia como (?:x|y) significa intentar hacer coincidir x primero y, si no coincide, intentar hacer coincidir y .
Si se admite un lookbehind en su entorno, puede hacer coincidir SOME_PREFIX y luego hacer coincidir cualquier carácter excepto SOME_PREFIX o un ' y solo hacer coincidir el ' cuando está directamente precedido por ?
SOME_PREFIX(?:(?!SOME_PREFIX|').)*(?:(?<=\?)'(?:(?!SOME_PREFIX|').)*)*'Explicación
SOME_PREFIX Coincide literalmente(?: Grupo de no captura para repetir como un todo(?!SOME_PREFIX|') negativa para afirmar no SOME_PREFIX o ' directamente a la derecha. Haga coincidir cualquier carácter excepto una nueva línea para no cruzar líneas)* Cerrar el grupo de no captura y opcionalmente repetirlo(?: Grupo de no captura para repetir como un todo(?<=\?)' Match ' solo cuando va precedido directamente por ?(?:(?!SOME_PREFIX|').)* El mismo patrón repetitivo que en la primera parte)* Cerrar el grupo de no captura y opcionalmente repetirlo' Coincide con una comilla simpleDemostración de expresiones regulares
const regex = /SOME_PREFIX(?:(?!SOME_PREFIX|').)*(?:(?<=\?)'(?:(?!SOME_PREFIX|').)*)*'/g; const str = "you could have something before'SOME_PREFIX foo bar'something in the middle'SOME_PREFIX BAR FOO ?'SHOULD ALSO MATCH'test'"; console.log(str.match(regex));