Eu preciso AND lógico em regex.
algo como
jack AND James
concorda com as seguintes strings
'oi jack aqui é james '
'oi james aqui é jack '
Eu preciso AND lógico em regex.
algo como
jack AND James
concorda com as seguintes strings
'oi jack aqui é james '
'oi james aqui é jack '
Respostas:
Você pode fazer verificações usando lookarounds :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Essa abordagem tem a vantagem de poder especificar facilmente várias condições.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vim
sintaxe: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
ou\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
falha em combinar, blah #tgif blah #friday blah
mas ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
funciona bem.
\b
significa aqui?
Experimentar:
james.*jack
Se você deseja os dois ao mesmo tempo, então or
eles:
james.*jack|jack.*james
james.*?jack|jack.*?james
. Isso ajudará em textos grandes.
Explicação do comando que eu vou escrever : -
.
significa qualquer caractere, o dígito pode ser substituído por.
*
significa zero ou mais ocorrências de algo escrito antes dele.
|
significa 'ou' .
Assim,
james.*jack
procuraria james
, qualquer número de caracteres até jack
chegar.
Desde que você quer um jack.*james
oujames.*jack
Daí o comando :
jack.*james|james.*jack
Sua curta e doce
(?=.*jack)(?=.*james)
O Vim possui um operador de ramificação \&
que é útil ao procurar uma linha contendo um conjunto de palavras, em qualquer ordem. Além disso, estender o conjunto de palavras necessárias é trivial.
Por exemplo,
/.*jack\&.*james
corresponderá a uma linha contendo jack
e james
, em qualquer ordem.
Veja esta resposta para mais informações sobre o uso. Não conheço nenhum outro sabor de regex que implemente ramificação; o operador nem está documentado na entrada da Wikipedia Expression regular .
jack
e Umjames
Caso não sejam permitidos dois jack
ou dois james
, apenas um jack
e um james
serão válidos, é provável que possamos criar uma expressão semelhante a:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Aqui, excluiríamos essas instâncias de pares usando estas instruções:
(?!.*\bjack\b.*\bjack\b)
e,
(?!.*\bjames\b.*\bjames\b)
Também podemos simplificar isso para,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
Se você deseja simplificar / modificar / explorar a expressão, isso foi explicado no painel superior direito de regex101.com . Se desejar, também é possível assistir neste link , como ele corresponderia a algumas entradas de amostra.
O jex.im visualiza expressões 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
e um james
em ordem específicaTambém pode ser projetado para o primeiro james
último jack
, semelhante ao seguinte:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
e vice versa:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$