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).*$
vimsintassi: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$oppure\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$non riesce a eguagliare blah #tgif blah #friday blahma ^(?=.*\bfriday\b)(?=.*\btgif\b).*$funziona bene.
\bsignifica qui?
Provare:
james.*jack
Se vuoi entrambi allo stesso tempo, allora orloro:
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 jackarriva.
Dal momento che vuoi uno jack.*jamesojames.*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 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 .
jacke UnojamesNel 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)
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}`);
});
}
jacke uno jamesin ordine specificoPuò anche essere progettato per il primo jamesultimo 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).*$