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).*$
vimsintaxis: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$o\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$no coincide blah #tgif blah #friday blahpero ^(?=.*\bfriday\b)(?=.*\btgif\b).*$funciona bien.
\bsignifica aquí?
Tratar:
james.*jack
Si quieres ambos al mismo tiempo, entonces orellos:
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 jackllegue.
Ya que quieres jack.*jamesojames.*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 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 .
jacky unojamesEn caso de que no se permitan dos jacko dos james, solo uno jacky uno jamesserí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}`);
});
}
jacky Uno jamesen 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).*$