Lo que estoy buscando hacer es modificar una expresión regular (sabor JS) para que no coincida si el patrón está precedido y seguido por la misma cadena.
A modo de analogía simple, supongamos que quiero hacer coincidir todas las instancias de n que no están precedidas ni seguidas por e . Entonces, por ejemplo, la expresión regular no debe coincidir con la n en alkene , pero aún debe coincidir con la n en pen o nest , que solo tienen la e directamente adyacente a n en un lado, no en ambos.
La mayoría de los hilos antiguos que he visto tratando de encontrar una respuesta básicamente dicen "simplemente use miradas negativas", pero el problema es que (?<!e)n(?!e) no coincide con ninguna de esas entradas, porque el lookbehind y lookahead son procesados por el motor de expresiones regulares por separado, por lo que considera que cualquier condición es suficiente para excluir la coincidencia.
(La expresión regular real es (?<!¸ª)()(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)(?!¸ª) y no coincide con la ɣʷ en t͡ʃe:h₁dɣʷo¸ªh₂¸ª , pero eso hace que el problema parezca mucho más difícil de explicar de lo que debería ser)
¿Cómo modifica una expresión regular para excluir solo patrones cuando están anidados?
El patrón (?<!b)a(?!b) aquí debe reemplazarse con (?<!b(?=ab))a o a(?!(?<=ba)b) . El punto es llamar una búsqueda hacia adelante inversa o una búsqueda hacia atrás desde una búsqueda hacia atrás o una búsqueda hacia adelante.
Vea la corrección de su patrón (sin ninguna optimización) donde tomé la búsqueda anticipada, la pegué dentro de la búsqueda posterior después de ª , invertí la búsqueda anticipada (es decir, la hice positiva) y agregué todo el patrón antes de ¸ª en la búsqueda anticipada para poder llegar a la derecha ¸ª :
(?<!¸ª(?!(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)¸ª))()(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)O, si pones el lookbehind en lookahead:
()(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)(?!(?<=¸ª(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a))¸ª)Vea la demostración de expresiones regulares (y la demostración de expresiones regulares #2 ).
Siempre que su patrón sea simple, es mejor no repetir el patrón en las búsquedas, por lo general solo puede usar . o .{x} donde x representa el número de caracteres que puede coincidir con la parte del patrón que consume. Aquí, no está claro con cuántos caracteres puede coincidir el patrón, probablemente puede usar (?<!¸ª(?!.{1,2}¸ª))()(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a) , pero no tengo ningún caso límite para probar.
Mejorar esto aún más puede producir (?<!¸ª(?!.{1,2}¸ª))()(ɣʷ|[hr]₂|r₃|w|j)([eoøɑiɚyua]) ( demostración ).