@AndersonGreen, la pregunta fue bloqueada prematuramente. Las respuestas son severamente deficientes ya que esas soluciones no son viables ya que la mayoría de las expresiones regulares no reconocen la búsqueda y el cuantificador de modo . Creo que el cuantificador existía en el punto de la pregunta que se hacía.
¿Alguien sabe por qué esto se rompería (al menos en JavaScript) cuando trato de buscar cadenas que comiencen con '#'? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$no coincide blah #tgif blah #friday blahpero ^(?=.*\bfriday\b)(?=.*\btgif\b).*$funciona bien.
La respuesta aceptada funcionó. Esto también funcionó perfectamente para mí. Para buscar código en Visual Studio, 'buscar resultados'.
Yogurt The Wise
1
¡Esto funciona para mí y es mucho más conciso y fácil de entender que la respuesta aceptada!
Kumar Manish
1
Necesitaba una solución que solo tuviera dos nombres para coincidir, por lo que esta respuesta es más concisa para ese caso. Pero la respuesta aceptada se vuelve más concisa más allá de 2 ya que el número de "o" s aumenta factorialmente. Para 3 nombres habría 6 "o" s, 4 nombres serían 24 "o" s, etc.
WileCau
Yo recomendaría hacerlo perezoso james.*?jack|jack.*?james. Esto ayudará en textos grandes.
Jekis
42
Explicación del comando que voy a escribir : -
. significa cualquier carácter, el dígito puede reemplazarlo.
* significa cero o más ocurrencias de cosas escritas justo antes.
|significa 'o' .
Entonces,
james.*jack
buscaría james , luego cualquier número de caracteres hasta que jackllegue.
Como nota al margen: también podría haber editado la respuesta de @ icyrock (que es la misma que la suya, solo 6 años antes), su explicación es muy útil por sí sola.
WoJ
2
Gracias por esta respuesta, sin embargo, siento la necesidad de señalar que en la búsqueda de VSCode, su conector de respuesta . * James | james. * jack tomará los espacios entre el '|' (o) símbolo en consideración durante la búsqueda. jack. * james | james. * jack funciona y no busca los espacios
jgritten
2
IF $ _explanation === "impresionante" ENTONCES devuelve $ THUMBS_UP ENDIF;
Vim tiene un operador de rama \&que es útil cuando se busca una línea que contenga un conjunto de palabras, en cualquier orden. Además, extender el conjunto de palabras requeridas es trivial.
Por ejemplo,
/.*jack\&.*james
coincidirá con una línea que contiene jacky james, en cualquier orden.
Consulte esta respuesta para obtener más información sobre el uso. No conozco ningún otro sabor regex que implemente la ramificación; el operador ni siquiera está documentado en la entrada de Wikipedia de Expresión regular .
Si desea simplificar / modificar / explorar la expresión, se explica en el panel superior derecho de regex101.com . Si lo desea, también puede ver en este enlace cómo coincidiría con algunas entradas de muestra.
const regex =/^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;const str =`hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;let m;while((m = regex.exec(str))!==null){// This is necessary to avoid infinite loops with zero-width matchesif(m.index === regex.lastIndex){
regex.lastIndex++;}// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex)=>{
console.log(`Found match, group ${groupIndex}: ${match}`);});}
Respuestas:
Puede hacer comprobaciones usando lookarounds :
Pruébalo.
Este enfoque tiene la ventaja de que puede especificar fácilmente múltiples condiciones.
fuente
vim
sintaxis:^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
o\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
no coincideblah #tgif blah #friday blah
pero^(?=.*\bfriday\b)(?=.*\btgif\b).*$
funciona bien.\b
significa aquí?Tratar:
Si quieres ambos al mismo tiempo, entonces
or
ellos:fuente
james.*?jack|jack.*?james
. Esto ayudará en textos grandes.Explicación del comando que voy a escribir : -
.
significa cualquier carácter, el dígito puede reemplazarlo.*
significa cero o más ocurrencias de cosas escritas justo antes.|
significa 'o' .Entonces,
buscaría
james
, luego cualquier número de caracteres hasta quejack
llegue.Ya que quieres
jack.*james
ojames.*jack
De ahí el comando :
fuente
Es corto y dulce
fuente
Tu puedes hacer:
fuente
Vim tiene un operador de rama
\&
que es útil cuando se busca una línea que contenga un conjunto de palabras, en cualquier orden. Además, extender el conjunto de palabras requeridas es trivial.Por ejemplo,
/.*jack\&.*james
coincidirá con una línea que contiene
jack
yjames
, en cualquier orden.Consulte esta respuesta para obtener más información sobre el uso. No conozco ningún otro sabor regex que implemente la ramificación; el operador ni siquiera está documentado en la entrada de Wikipedia de Expresión regular .
fuente
MÉTODO 1: uno
jack
y unojames
En caso de que no se permitan dos
jack
o dosjames
, solo unojack
y unojames
serían válidos, es probable que podamos diseñar una expresión similar a:Aquí, excluiríamos esas instancias de pares usando estas declaraciones:
y,
Demo de RegEx 1
También podemos simplificar eso para,
RegEx Demo 2
Si desea simplificar / modificar / explorar la expresión, se explica en el panel superior derecho de regex101.com . Si lo desea, también puede ver en este enlace cómo coincidiría con algunas entradas de muestra.
Circuito RegEx
jex.im visualiza expresiones regulares:
Prueba
MÉTODO 2: Uno
jack
y Unojames
en orden específicoTambién se puede diseñar para el primero al
james
últimojack
, similar al siguiente:RegEx Demo 3
y viceversa:
RegEx Demo 4
fuente
Puede utilizar la función de cuantificador de expresiones regulares, ya que es
lookaround
posible que no sea compatible todo el tiempo.fuente