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).*$
vim
Syntax: ^\(.*\<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.
\b
bedeutet hier?
Versuchen:
james.*jack
Wenn Sie beide gleichzeitig wollen, dann sind or
sie:
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 jack
kommt.
Da willst du entweder jack.*james
oderjames.*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 jack
und james
in 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 .
jack
und Einsjames
Nur für den Fall, dass zwei jack
oder zwei james
nicht erlaubt sind, nur eins jack
und eins james
gü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}`);
});
}
jack
und Eins james
in einer bestimmten ReihenfolgeEs kann auch für das erste bis james
letzte 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).*$