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 '
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 '
Risposte:
Puoi fare controlli usando i lookaround :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Questo approccio ha il vantaggio di poter specificare facilmente più condizioni.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vim
sintassi: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
oppure\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
non riesce a eguagliare blah #tgif blah #friday blah
ma ^(?=.*\bfriday\b)(?=.*\btgif\b).*$
funziona bene.
\b
significa qui?
Provare:
james.*jack
Se vuoi entrambi allo stesso tempo, allora or
loro:
james.*jack|jack.*james
james.*?jack|jack.*?james
. Questo aiuterà su testi di grandi dimensioni.
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 jack
arriva.
Dal momento che vuoi uno jack.*james
ojames.*jack
Quindi comando :
jack.*james|james.*jack
È corto e dolce
(?=.*jack)(?=.*james)
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 jack
e 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 .
jack
e Unojames
Nel caso in cui due jack
o due james
non fossero consentiti, solo uno jack
e uno james
sarebbero 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)
Possiamo anche semplificare ciò a,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
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.
jex.im visualizza le espressioni regolari:
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 uno james
in ordine specificoPuò anche essere progettato per il primo james
ultimo jack
, simile al seguente:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
e viceversa:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$