Usted puede obtener una solución sin repetir, haciendo uso de backreferences y conditionals:
/^(")?(pattern)(?(1)\1|)$/
Partidos:
NO partido:
Este patrón es algo complejo, sin embargo. Primero busca una cotización opcional y la pone en referencia inversa 1 si se encuentra una. Luego busca tu patrón. Luego utiliza la sintaxis condicional para decir "si se encuentra nuevamente la referencia inversa 1, haga coincidirla, de lo contrario no concuerde con nada". El patrón completo es anchored (lo que significa que debe aparecer solo en una línea) para que las comillas no coincidentes no se capturen (de lo contrario, el pattern
en pattern"
coincidiría).
Tenga en cuenta que la compatibilidad con condicionales varía según el motor y las expresiones más detalladas pero repetitivas serán más ampliamente compatibles (y probablemente más fáciles de entender).
Actualización: Una versión mucho más simple de esta expresión regular sería /^(")?(pattern)\1$/
, que no necesita un condicional. Cuando estaba probando esto inicialmente, el probador que estaba usando me dio un falso negativo, lo que me llevó a descontarlo (¡Uy!).
Dejaré la solución con la condición de posteridad e interés, pero esta es una versión más simple que es más probable que funcione en una amplia variedad de motores (las referencias son la única característica que se usa aquí y que podrían no ser compatibles)
¿Qué sabor de expresión regular se utiliza? .Net permite este tipo de "coincidencia de paréntesis", pero otros sabores no lo hacen. – cristobalito
Una exploración relacionada: http://stackoverflow.com/questions/3165755/capturing-thispartonly-and-thispartonly-with-the-same-group – polygenelubricants