La mejor solución dependerá de lo que sepa sobre la entrada. Por ejemplo, si está buscando cosas que no están entre comillas dobles, ¿eso quiere decir que las comillas dobles siempre estarán correctamente equilibradas? ¿Se pueden escapar con barras invertidas o enviándolas entre comillas simples?
Suponiendo el caso más simple - sin anidación, hay escape - se podría utilizar una búsqueda hacia delante como esto:
preg_match('/THIS(?=(?:(?:[^"]*+"){2})*+[^"]*+\z)/')
Después de encontrar el objetivo (ESTA), la búsqueda hacia delante básicamente cuenta las comillas dobles después de eso señalar hasta el final de la cadena. Si hay un número impar de ellos, la coincidencia debe haberse producido dentro de un par de comillas dobles, por lo que no es válida (la búsqueda anticipada falla).
Como has descubierto, este problema no se adapta bien a las expresiones regulares; es por eso que todas las soluciones propuestas dependen de las características que no se encuentran en real expresiones regulares, como grupos de captura, estimaciones, cuantificadores reacios y posesivos. Yo ni siquiera probar esto sin possessive quantifiers o atomic groups.
EDIT: Para ampliar esta solución para dar cuenta de las comillas dobles que se pueden escapar con barras invertidas, sólo tiene que reemplazar las partes de la expresión regular que responden a "cualquier cosa que no es una comilla doble":
[^"]
con "todo lo que no es una cita o una barra invertida, o una barra invertida seguida de nada":
(?:[^"\\]|\\.)
como las secuencias barra invertida-escape son relativamente raros, vale la pena para que coincida con el mayor número de caracteres sin escape como sea posible mientras está en esa parte de la expresión regular:
(?:[^"\\]++|\\.)
Poniendo todo junto, se convierte en la expresión regular:
'/THIS\d+(?=(?:(?:(?:[^"\\]++|\\.)*+"){2})*+(?:[^"\\]++|\\.)*+$)/'
aplicados a su cadena de prueba:
'Match THIS1 and "NOT THIS2" but THIS3 and "NOT "THIS4" or NOT THIS5" ' +
'but \"THIS6\" is good and \\\\"NOT THIS7\\\\".'
... Debe coincidir 'THIS1'
, 'THIS3'
, 'THIS4'
y 'THIS6'
.
Depende de qué tipo de expresiones regulares que está utilizando - si es o no permite la búsqueda hacia delante positivo/negativo/detrás –
estaba asumiendo funciones de expresiones regulares completos como PHP, Perl, etc ... – Xeoncross