Ich brauche logisches UND in Regex.
etwas wie
Jack AND James
stimme den folgenden Zeichenfolgen zu
"Hallo Jack hier ist James "
"Hallo James hier ist Jack "
Ich brauche logisches UND in Regex.
etwas wie
Jack AND James
stimme den folgenden Zeichenfolgen zu
"Hallo Jack hier ist James "
"Hallo James hier ist Jack "
Antworten:
Sie können Überprüfungen mithilfe von Lookarounds durchführen :
^(?=.*\bjack\b)(?=.*\bjames\b).*$
Dieser Ansatz hat den Vorteil, dass Sie problemlos mehrere Bedingungen angeben können.
^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$
vimSyntax: ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$oder\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$stimmt nicht überein blah #tgif blah #friday blah, ^(?=.*\bfriday\b)(?=.*\btgif\b).*$funktioniert aber einwandfrei.
\bbedeutet hier?
Versuchen:
james.*jack
Wenn Sie beide gleichzeitig wollen, dann sind orsie:
james.*jack|jack.*james
james.*?jack|jack.*?james. Dies hilft bei großen Texten.
Erklärung des Befehls, den ich schreiben werde : -
. bedeutet, dass jedes Zeichen, Ziffer anstelle von kommen kann.
* bedeutet null oder mehr Vorkommen von Dingen, die unmittelbar davor geschrieben wurden.
|bedeutet "oder" .
So,
james.*jack
würde suchen james , dann eine beliebige Anzahl von Zeichen bis jackkommt.
Da willst du entweder jack.*jamesoderjames.*jack
Daher Befehl :
jack.*james|james.*jack
Es ist kurz und süß
(?=.*jack)(?=.*james)
Vim verfügt über einen Verzweigungsoperator \&, der bei der Suche nach einer Zeile mit einer Reihe von Wörtern in beliebiger Reihenfolge hilfreich ist. Darüber hinaus ist das Erweitern des Satzes erforderlicher Wörter trivial.
Beispielsweise,
/.*jack\&.*james
stimmt mit einer Zeile überein, die jackund jamesin beliebiger Reihenfolge enthält.
Weitere Informationen zur Verwendung finden Sie in dieser Antwort . Mir ist kein anderer Regex-Geschmack bekannt, der eine Verzweigung implementiert. Der Operator ist nicht einmal im Wikipedia-Eintrag für reguläre Ausdrücke dokumentiert .
jackund EinsjamesNur für den Fall, dass zwei jackoder zwei jamesnicht erlaubt sind, nur eins jackund eins jamesgültig sind, können wir wahrscheinlich einen Ausdruck entwerfen, der ähnlich ist wie:
^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$
Hier würden wir diese Paarinstanzen mit den folgenden Anweisungen ausschließen:
(?!.*\bjack\b.*\bjack\b)
und,
(?!.*\bjames\b.*\bjames\b)
Wir können das auch vereinfachen,
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$
Wenn Sie den Ausdruck vereinfachen / ändern / untersuchen möchten, wurde dies im oberen rechten Bereich von regex101.com erläutert . Wenn Sie möchten , können Sie in diesem Link auch sehen , wie es mit einigen Beispieleingaben übereinstimmt.
jex.im visualisiert reguläre Ausdrücke:
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}`);
});
}
jackund Eins jamesin einer bestimmten ReihenfolgeEs kann auch für das erste bis jamesletzte entworfen werden jack, ähnlich dem folgenden:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$
und umgekehrt:
^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$