Obviamente, puede usar |
(¿tubería?) Para representar OR
, pero ¿hay alguna manera de representar AND
también?
Específicamente, me gustaría hacer coincidir los párrafos de texto que contienen TODOS de una frase determinada, pero sin ningún orden en particular.
I'd like to match paragraphs of text
.. 2. Contiene texto fuera de orden . El número 1 está abierto a interpretación. El número 2 se puede hacer de dos maneras. Modo 1:(?:(?:(?(1)(?!))\b(phrase1)\b.*?|(?(2)(?!))\b(phrase2)\b.*?)){2}
Modo 2:(?=.*\bphrase1\b)(?=.*\bphrase2\b)
en este caso, la coincidencia del párrafo en este caso no está definida hasta que se formalice la definición del párrafo.Respuestas:
Use una expresión regular que no consuma.
La notación típica (es decir, Perl / Java) es:
(?=
expr)
Esto significa "hacer coincidir expr pero luego continuar haciendo coincidir en el punto de partida original".
Puede hacer tantos como desee, y esto será un "y". Ejemplo:
(?=match this expression)(?=match this too)(?=oh, and this)
Incluso puede agregar grupos de captura dentro de las expresiones no consumidoras si necesita guardar algunos de los datos allí.
fuente
Debe usar anticipación como han dicho algunos de los otros respondedores, pero la anticipación debe tener en cuenta otros caracteres entre su palabra objetivo y la posición de coincidencia actual. Por ejemplo:
El
.*
primer vistazo anticipado le permite coincidir con la cantidad de caracteres que necesita antes de llegar a "palabra1". Luego se restablece la posición de coincidencia y la segunda búsqueda anticipada busca "word2". Restablezca de nuevo, y la parte final coincide con "word3"; Dado que es la última palabra que está buscando, no es necesario que esté en un futuro, pero no duele.Para hacer coincidir un párrafo completo, debe anclar la expresión regular en ambos extremos y agregar una final
.*
para consumir los caracteres restantes. Usando la notación de estilo Perl, eso sería:El modificador 'm' es para el modo multilínea; permite
^
y$
coincide en los límites de los párrafos ("límites de línea" en expresiones regulares). Es esencial en este caso que no utilice el modificador 's', que permite que el metacarácter de punto coincida con las nuevas líneas y con todos los demás caracteres.Finalmente, desea asegurarse de que está haciendo coincidir palabras enteras y no solo fragmentos de palabras más largas, por lo que debe agregar límites de palabras:
fuente
.*
con[\s\S]*
javascript si tiene nuevas líneas, ya que.
el motor regex de javascript no coincide con las nuevas líneas y no se puede hacer que se modifiquenMira este ejemplo:
Tenemos 2 expresiones regulares A y B y queremos unir ambas, por lo que en pseudocódigo se ve así:
Se puede escribir sin usar el operador AND de esta manera:
en PCRE:
fuente
(?=expr)
no. Parece ser dependiente de la implementación.^
significa "comienzo de cadena" en la sintaxis de expresiones regulares?^
es negación solo al comienzo de una clase de personaje. A menos que CMake esté haciendo algo realmente extraño (hasta el punto de que llamar a su lenguaje de coincidencia de patrones "regex" podría considerarse engañoso o incorrecto) supongo que el hecho de que funcionó para usted fue un accidente aislado.Puede hacerlo con una expresión regular, pero probablemente querrá otra. Por ejemplo, use varias expresiones regulares y combínelas en una cláusula if.
Puede enumerar todas las permutaciones posibles con una expresión regular estándar, como esta (coincide con a, byc en cualquier orden):
Sin embargo, esto hace una expresión regular muy larga y probablemente ineficiente, si tiene más de un par de términos.
Si está utilizando una versión extendida de expresiones regulares, como Perl o Java, tienen mejores formas de hacerlo. Otras respuestas han sugerido el uso de operaciones positivas de búsqueda anticipada.
fuente
a(bc|cb)|b(ac|ca)|c(ab|ba)
. Y lo más importante, puedes usarlo con todo el sabor regex.El operador AND está implícito en la sintaxis RegExp.
En cambio, el operador OR debe especificarse con una tubería.
El siguiente RegExp:
significa la letra
a
Y la letrab
.También funciona con grupos:
significa el grupo
co
Y el grupode
.Reemplazar el AND (implícito) con un OR requeriría las siguientes líneas:
fuente
¿No es posible en su caso hacer el AND en varios resultados coincidentes? en seudocódigo
fuente
¿Por qué no usar awk?
con awk regex AND, OR importa es tan simple
fuente
Si usa expresiones regulares de Perl, puede usar anticipación positiva:
Por ejemplo
serían números mayores que 100 y divisibles por 5
fuente
Podría canalizar su salida a otra expresión regular. Usando grep, podrías hacer esto:
grep A | grep B
fuente
Además de la respuesta aceptada
Le proporcionaré algunos ejemplos prácticos que aclararán las cosas para algunos de ustedes. Por ejemplo, digamos que tenemos esas tres líneas de texto:
Ver demo aquí DEMO
Lo que queremos hacer aquí es seleccionar el signo + pero solo si es después de dos números con un espacio y si es antes de cuatro números. Esas son las únicas limitaciones. Usaríamos esta expresión regular para lograrlo:
Tenga en cuenta que si separa la expresión, obtendrá resultados diferentes.
O tal vez desee seleccionar texto entre las etiquetas ... ¡pero no las etiquetas! Entonces podrías usar:
para este texto:
Ver demo aquí DEMO
fuente
El orden siempre está implícito en la estructura de la expresión regular. Para lograr lo que desea, deberá hacer coincidir la cadena de entrada varias veces con diferentes expresiones.
Lo que quieres hacer no es posible con una sola expresión regular.
fuente
Use AND fuera de la expresión regular. En PHP, el operador de búsqueda anticipada no parecía funcionar para mí, sino que usé esto
La expresión regular anterior coincidirá si la longitud de la contraseña es de 3 caracteres o más y no hay espacios en la contraseña.
fuente