@ AndersonGreen, die Frage wurde vorzeitig gesperrt. Die Antworten fehlen stark , da diese Lösungen nicht lebensfähig sind , da die meisten Regex nicht erkennen Lookarounds und Modus quantifier . Ich glaube, der Quantifizierer existierte zum Zeitpunkt der gestellten Frage.
Weiß jemand, warum dies (zumindest in JavaScript) nicht funktioniert, wenn ich versuche, nach Zeichenfolgen zu suchen, die mit '#' beginnen? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$stimmt nicht überein blah #tgif blah #friday blah, ^(?=.*\bfriday\b)(?=.*\btgif\b).*$funktioniert aber einwandfrei.
Die akzeptierte Antwort hat funktioniert. Das hat auch bei mir perfekt funktioniert. Für die Suche nach Code in Visual Studio 'Ergebnisse finden'.
Joghurt der Weise
1
Dieser funktioniert für mich und ist viel prägnanter und leichter zu verstehen als die akzeptierte Antwort!
Kumar Manish
1
Ich brauchte eine Lösung, bei der nur zwei Namen übereinstimmten, daher ist diese Antwort für diesen Fall präziser. Die akzeptierte Antwort wird jedoch über 2 hinaus präziser, da die Anzahl der "oder" s faktoriell zunimmt. Für 3 Namen gäbe es 6 "oder" s, 4 Namen wären 24 "oder" s usw.
WileCau
Ich würde empfehlen, es faul zu machen james.*?jack|jack.*?james. Dies hilft bei großen Texten.
Jekis
42
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.
Als Randnotiz: Sie hätten auch die Antwort von @ icyrock bearbeiten können (die dieselbe ist wie Ihre, nur 6 Jahre zuvor). Ihre Erklärung ist für sich genommen sehr nützlich.
WoJ
2
Vielen Dank für diese Antwort. Ich möchte jedoch darauf hinweisen, dass bei der VSCode-Suche Ihre Antwortbuchse . * James | james. * jack nimmt die Leerzeichen zwischen dem '|' (oder) Symbol bei der Suche berücksichtigt. jack. * james | james. * jack funktioniert und sucht nicht nach den Leerzeichen
jgritten
2
IF $ _explanation === "awesome" THEN return $ THUMBS_UP ENDIF;
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 .
Nur 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:
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.
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 matchesif(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}`);});}
Antworten:
Sie können Überprüfungen mithilfe von Lookarounds durchführen :
Probier es aus.
Dieser Ansatz hat den Vorteil, dass Sie problemlos mehrere Bedingungen angeben können.
quelle
vim
Syntax:^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$
oder\v^(.*<jack>)@=(.*<james>)@=.*$
^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$
stimmt nicht übereinblah #tgif blah #friday blah
,^(?=.*\bfriday\b)(?=.*\btgif\b).*$
funktioniert aber einwandfrei.\b
bedeutet hier?Versuchen:
Wenn Sie beide gleichzeitig wollen, dann sind
or
sie:quelle
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,
würde suchen
james
, dann eine beliebige Anzahl von Zeichen bisjack
kommt.Da willst du entweder
jack.*james
oderjames.*jack
Daher Befehl :
quelle
Es ist kurz und süß
quelle
Du kannst tun:
quelle
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
undjames
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 .
quelle
Methode 1: Eins
jack
und Einsjames
Nur für den Fall, dass zwei
jack
oder zweijames
nicht erlaubt sind, nur einsjack
und einsjames
gültig sind, können wir wahrscheinlich einen Ausdruck entwerfen, der ähnlich ist wie:Hier würden wir diese Paarinstanzen mit den folgenden Anweisungen ausschließen:
und,
RegEx Demo 1
Wir können das auch vereinfachen,
RegEx Demo 2
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.
RegEx Circuit
jex.im visualisiert reguläre Ausdrücke:
Prüfung
Methode 2: Eins
jack
und Einsjames
in einer bestimmten ReihenfolgeEs kann auch für das erste bis
james
letzte entworfen werdenjack
, ähnlich dem folgenden:RegEx Demo 3
und umgekehrt:
RegEx Demo 4
quelle
Sie können die Quantifiziererfunktion von Regex verwenden, da diese
lookaround
möglicherweise nicht immer unterstützt wird.quelle