Necesito lógica Y en expresiones regulares.
algo como
Jack y James
de acuerdo con las siguientes cadenas
'Hola Jack, aquí está James '
'Hola James, aquí está Jack '
Necesito lógica Y en expresiones regulares.
algo como
Jack y James
de acuerdo con las siguientes cadenas
'Hola Jack, aquí está James '
'Hola James, aquí está Jack '
Respuestas:
Puede hacer comprobaciones usando lookarounds :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Este enfoque tiene la ventaja de que puede especificar fácilmente múltiples condiciones.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vim
sintaxis: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
o\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
no coincide blah #tgif blah #friday blah
pero ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
funciona bien.
\b
significa aquí?
Tratar:
james.*jack
Si quieres ambos al mismo tiempo, entonces or
ellos:
james.*jack|jack.*james
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,
james.*jack
buscaría james
, luego cualquier número de caracteres hasta que jack
llegue.
Ya que quieres jack.*james
ojames.*jack
De ahí el comando :
jack.*james|james.*jack
Es corto y dulce
(?=.*jack)(?=.*james)
Tu puedes hacer:
\bjack\b.*\bjames\b|\bjames\b.*\bjack\b
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
y 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 .
jack
y unojames
En caso de que no se permitan dos jack
o dos james
, solo uno jack
y uno james
serían válidos, es probable que podamos diseñar una expresión similar a:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Aquí, excluiríamos esas instancias de pares usando estas declaraciones:
(?!.*\bjack\b.*\bjack\b)
y,
(?!.*\bjames\b.*\bjames\b)
También podemos simplificar eso para,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
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.
jex.im visualiza expresiones regulares:
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 matches
if (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}`);
});
}
jack
y Uno james
en orden específicoTambién se puede diseñar para el primero al james
último jack
, similar al siguiente:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
y viceversa:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$