Negando una referencia inversa en expresiones regulares

si una cadena tiene este formato predicho:

value = "hello and good morning" 

Donde “(citas) también podría ser” (comillas simples), y el carácter de cierre (“o”) será el mismo que el de apertura. Quiero hacer coincidir la cadena entre las comillas.

 \bvalue\s*=\s*(["'])([^\1]*)\1 

(los dos son para permitir cualquier espacio cerca del signo =)

El primer “grupo capturado” (dentro del primer par de corchetes) – debe coincidir con la cita de apertura que debería ser ‘o’ entonces – Se supone que debo permitir cualquier número de caracteres que no sean los que se capturaron en el primer grupo, y luego espero que el personaje sea capturado en el grupo (las comillas que lo encierran).

(la cadena requerida debe capturarse en el segundo grupo de captura).
Esto no funciona, sin embargo.

Esto hace:

 \bvalue\s*=\s*(['"])([^"']*)["'] 

pero quiero asegurarme de que tanto la comilla de apertura como la de cierre (ya sean dobles o únicas) sean las mismas.

EDITAR
El objective era básicamente obtener la etiqueta de apertura de un ancla que tiene un determinado nombre de clase incluido dentro de su atributo de clase, y quería cubrir la rara ocasión del atributo de clase que incluye a (‘) o a (“).

Siguiendo todos los consejos aquí, utilicé el patrón:

 <\s*\ba\b[^]+\bclass\s*=\s*("|'|\\"|\\')(?:(?!\1).)*\s*classname\s*(?:(?!\1).)*\1[^>]*> 

Significado :
Encuentre un letrero de apertura de etiqueta.
Permitir cualquier espacio
Encuentra la palabra a.
Permitir cualquier etiqueta que no sea de cierre.
Encuentra “clase (cualquier espacio) = (cualquier espacio)”
Obtenga citas de apertura, una de las siguientes: (“o ‘o \” o \’).
De la respuesta de Alan Moore: Permitir cualquier personaje que no sean las citas de apertura.
encontrar nombre de clase
Permitir cualquier carácter que no sean las comillas de apertura.
Encuentre la cotización de cierre que es la misma que la apertura.
Permitir todos los caracteres de etiqueta de cierre.
Encuentra la etiqueta de cierre char.

En lugar de una clase de caracteres negada, debes usar un lookahead negativo:

 \bvalue\s*=\s*(["'])(?:(?!\1).)*\1 

(?:(?!\1).)* Consume un carácter a la vez, después de que la búsqueda anticipada ha confirmado que el personaje no es lo que correspondía al grupo de captura, (["'']) . Una clase de personaje, negada o no, solo puede coincidir con un carácter a la vez. Por lo que sabe el motor de expresiones regulares, \1 podría representar cualquier número de caracteres, y no hay forma de convencerlo de que \1 solo contendrá " o ' en este caso. Entonces debes ir con la solución más general (y menos legible).

Puedes usar:

 \bvalue\s*=\s*(['"])(.*?)\1 

Míralo

Sin saber para qué necesita la información (o incluso qué idioma o herramienta está usando esta expresión regular), hay muchas rutas que puedo sugerir.

Usando estas cadenas:

 value = "hello and good morning" value = 'hola y buenos dias' value = 'how can I say "goodbye" so soon?' value = 'why didn\'t you say "hello" to me this morning?' value = "Goodbye! Please don't forget to write!" value = 'Goodbye! Please don\'t forget to write!' 

esta expresión:

 "((\\"|[^"])*)"|'((\\'|[^'])*)' 

coincidirá con estas cadenas:

 "hello and good morning" 'hola y buenos dias' 'how can I say "goodbye" so soon?' 'why didn\'t you say "hello" to me this morning?' "Goodbye! Please don't forget to write!" 'Goodbye! Please don\'t forget to write!' 

Permitiría el tipo de “otro” tipo de cita o el mismo tipo de cita, cuando se escape con un único \ precedente. El contenido de las cadenas entre comillas está en el grupo 1 o 3. Puede averiguar qué tipo de comillas se usan obteniendo el primer (o último) carácter.

Si necesita que algunas de estas cosas sean en grupos de coincidencias en particular, proporcione ejemplos más específicos (e incluya elementos que no deberían funcionar, pero parece que podrían estar cerca).

Por favor, pregunte si desea tomar esta ruta y necesita un poco más de ayuda

Intereting Posts