Regex per abbinare la stringa contenente due nomi in qualsiasi ordine


180

Ho bisogno di un AND logico in regex.

qualcosa di simile a

jack AND james

concordare con le seguenti stringhe

  • ciao jack ecco james '

  • 'ciao james qui è jack '



@AndersonGreen, la domanda è stata prematuramente bloccata. Le risposte sono gravemente carenti in quanto tali soluzioni non sono praticabili poiché la maggior parte dei regex non riconosce il lookaround e il quantificatore della modalità . Credo che esistessero quantificatori al momento della domanda.
XPMai

Risposte:


261

Puoi fare controlli usando i lookaround :

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

Provalo.

Questo approccio ha il vantaggio di poter specificare facilmente più condizioni.

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

18
Qualcuno potrebbe spiegare in modo un po 'più dettagliato come funziona questo esempio?
bjmc,

2
vimsintassi: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$oppure\v^(.*<jack>)@=(.*<james>)@=.*$
mykhal,

Qualcuno sa perché questo si interromperebbe (almeno in JavaScript) quando provo a cercare stringhe che iniziano con '#'? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$non riesce a eguagliare blah #tgif blah #friday blahma ^(?=.*\bfriday\b)(?=.*\btgif\b).*$funziona bene.
btleffler,

2
Cosa \bsignifica qui?
VarunAgw,


107

Provare:

james.*jack

Se vuoi entrambi allo stesso tempo, allora orloro:

james.*jack|jack.*james

1
La risposta accettata ha funzionato. anche questo ha funzionato perfettamente per me. Per cercare il codice in Visual Studio "trova risultati".
Yogurt The Wise,

1
Questo funziona per me ed è molto più conciso e di facile comprensione della risposta accettata!
Kumar Manish,

1
Avevo bisogno di una soluzione che avesse solo due nomi da abbinare, quindi questa risposta è più concisa per quel caso. Ma la risposta accettata diventa più concisa oltre 2 poiché il numero di "o" aumenta in modo fattoriale. Per 3 nomi ci sarebbero 6 "o" s, 4 nomi sarebbero 24 "o" s, ecc.
WileCau

Consiglierei di renderlo pigro james.*?jack|jack.*?james. Questo aiuterà su testi di grandi dimensioni.
Jekis,

42

Spiegazione del comando che sto per scrivere : -

. indica qualsiasi carattere, cifra può venire al posto di.

* significa zero o più occorrenze di cose scritte appena prima.

|significa "o" .

Così,

james.*jack

cercherebbe james , quindi qualsiasi numero di caratteri fino a quando non jackarriva.

Dal momento che vuoi uno jack.*jamesojames.*jack

Quindi comando :

jack.*james|james.*jack

7
Come nota a margine: potresti anche aver modificato la risposta di @ icyrock (che è la stessa della tua, solo 6 anni prima), la tua spiegazione è molto utile da sola.
WoJ,

2
Grazie per questa risposta, tuttavia sento la necessità di sottolineare che nella ricerca VSCode, il tuo jack di risposta . * James | james. * jack occuperà gli spazi tra '|' (o) simbolo preso in considerazione durante la ricerca. jack. * james | james. * jack funziona e non cerca gli spazi
jgritten

2
IF $ _explanation === "fantastico" ALLORA restituisce $ THUMBS_UP ENDIF;
Syed Aqeel,



2

Vim ha un operatore di filiale \& utile durante la ricerca di una riga contenente un insieme di parole, in qualsiasi ordine. Inoltre, l'estensione dell'insieme delle parole richieste è banale.

Per esempio,

/.*jack\&.*james

corrisponderà a una riga contenente jacke james, in qualsiasi ordine.

Vedi questa risposta per maggiori informazioni sull'uso. Non sono a conoscenza di altri aromi regex che implementano la ramificazione; l'operatore non è nemmeno documentato sulla voce Wikipedia di espressione regolare .


2

METODO 1: Uno jacke Unojames

Nel caso in cui due jacko due jamesnon fossero consentiti, solo uno jacke uno jamessarebbero validi, possiamo probabilmente progettare un'espressione simile a:

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

Qui, escluderemmo quelle istanze di coppia usando queste istruzioni:

(?!.*\bjack\b.*\bjack\b)

e,

(?!.*\bjames\b.*\bjames\b)

Demo RegEx 1

Possiamo anche semplificare ciò a,

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

Demo RegEx 2


Se desideri semplificare / modificare / esplorare l'espressione, è stata spiegata nel pannello in alto a destra di regex101.com . Se lo desideri, puoi anche guardare in questo link , come corrisponderebbe ad alcuni input di esempio.


Circuito RegEx

jex.im visualizza le espressioni regolari:

inserisci qui la descrizione dell'immagine

Test

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


METODO 2: Uno jacke uno jamesin ordine specifico

Può anche essere progettato per il primo jamesultimo jack, simile al seguente:

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

Demo RegEx 3

e viceversa:

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

Demo RegEx 4


0

È possibile utilizzare la funzione di quantificazione di regex poiché lookaroundpotrebbe non essere supportata in ogni momento.

(\b(james|jack)\b.*){2,}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.