Regex para corresponder a sequência contendo dois nomes em qualquer ordem

180

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 '

Meloun
fonte
1
Possível duplicado: Palavras-mulitple-em-qualquer-fim usando-regex
Anderson Verde
@AndersonGreen, a pergunta foi bloqueada prematuramente. As respostas são muito escassas, pois essas soluções não são viáveis, pois a maioria dos regex não reconhece a pesquisa e o quantificador de modo . Eu acredito que o quantificador existia no momento da pergunta.
XPMai 01/06

Respostas:

261

Você pode fazer verificações usando lookarounds :

^(?=.*\bjack\b)(?=.*\bjames\b).*$

Teste-o.

Essa abordagem tem a vantagem de poder especificar facilmente várias condições.

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
Alin Purcaru
fonte
18
Alguém se importaria em explicar um pouco mais detalhadamente como esse exemplo funciona?
21414 bjmc
2
vimsintaxe: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$ou\v^(.*<jack>)@=(.*<james>)@=.*$
mykhal
Alguém sabe por que isso seria interrompido (pelo menos em JavaScript) quando tento procurar por strings começando com '#'? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$falha em combinar, blah #tgif blah #friday blahmas ^(?=.*\bfriday\b)(?=.*\btgif\b).*$funciona bem.
btleffler
2
O que \bsignifica aqui?
precisa saber é o seguinte
1
@VarunAgw Limite de palavras . regular-expressions.info/refwordboundaries.html
Alin Purcaru
106

Experimentar:

james.*jack

Se você deseja os dois ao mesmo tempo, então oreles:

james.*jack|jack.*james
icyrock.com
fonte
1
A resposta aceita funcionou. isso também funcionou perfeitamente para mim. Para pesquisar código no visual studio 'encontre resultados'.
Iogurte O Sábio
1
Este funciona para mim e é muito mais conciso e fácil de entender do que a resposta aceita!
precisa saber é o seguinte
1
Eu precisava de uma solução que tivesse apenas dois nomes para corresponder, portanto, essa resposta é mais concisa para esse caso. Mas a resposta aceita se torna mais concisa além de 2, pois o número de "ou" s aumenta fatorialmente. Por 3 nomes haveria 6 "ou" s, 4 nomes seria 24 "ou" s, etc.
WileCau
Eu recomendaria para torná-lo preguiçoso james.*?jack|jack.*?james. Isso ajudará em textos grandes.
Jekis 3/06/19
42

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é jackchegar.

Desde que você quer um jack.*jamesoujames.*jack

Daí o comando :

jack.*james|james.*jack
Shubham Sharma
fonte
7
Como observação lateral - você também pode ter editado a resposta do @ icyrock (que é a mesma que a sua, apenas 6 anos antes), sua explicação é muito útil por si só.
WoJ 23/01
2
Obrigado por esta resposta, no entanto, sinto a necessidade de ressaltar que, na pesquisa VSCode, sua resposta . * James | james. * jack ocupará os espaços entre o '|' (ou) símbolo em consideração durante a pesquisa. jack * james | james * jack.. obras e olhar does not para os espaços
jgritten
2
IF $ _explanation === "impressionante" ENTÃO retorne $ THUMBS_UP ENDIF;
Syed Aqeel
9

Sua curta e doce

(?=.*jack)(?=.*james)
Shivam Agrawal
fonte
6

Você pode fazer:

\bjack\b.*\bjames\b|\bjames\b.*\bjack\b
codaddict
fonte
2

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 jacke 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 .

Firstrock
fonte
2

MÉTODO 1: Um jacke Umjames

Caso não sejam permitidos dois jackou dois james, apenas um jacke um jamesserã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)

RegEx Demo 1

Também podemos simplificar isso para,

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$

RegEx Demo 2


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.


Circuito RegEx

O jex.im visualiza expressões regulares:

insira a descrição da imagem aqui

Teste

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}`);
    });
}


MÉTODO 2: Um jacke um jamesem ordem específica

També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).*$

RegEx Demo 3

e vice versa:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$

RegEx Demo 4

Emma
fonte
0

Você pode usar o recurso de quantificador do regex, pois lookaroundpode não ser suportado o tempo todo.

(\b(james|jack)\b.*){2,}
XPMai
fonte