2013-08-28 14 views
5

Ich verstehe nicht so viel regulärer Ausdruck und ich möchte eine, die zwei Strings entspricht erstellen.Javascript regulären Ausdruck, der zwei Strings entspricht

Ich weiß, für eine Zeichenfolge, dass der Code .match(/something/) ist und wenn Matches auf zwei Saiten ist es .match(/something|someotherthing/)

Wie man schreiben, die nur übereinstimmt, wenn beide Strings im Text zB „google microsoft“

gefunden

Antwort

9

Um dies mit einem einzigen regulären Ausdruck zu tun, müssen Sie die Tatsache berücksichtigen, dass sie in beliebiger Reihenfolge kommen können. (.* passt alle Zeichen zwischen den beiden Teil):

/google.*microsoft|microsoft.*google/ 

Hinweis: Wenn Sie mehr als 2 Teil tun wollte dies aus der Hand bekommen würde. 3 Saiten könnten in 6 verschiedene Bestellungen kommen, 5 Saiten könnten in 120 Bestellungen kommen, und 10 Teilstrings könnte bestellt werden 3628800 verschiedene Möglichkeiten! Aus diesem Grund können Features der Sprache (Javascript) selbst, wie in der Explosionspille-Antwort, viel besser sein als der Versuch, mit einem regulären Ausdruck zu viel zu tun.

5

Sie könnten nur .match zweimal verwenden

str.match(/google/) && str.match(/microsoft/) 

In diesem Fall kann es schneller sein .indexOf

Sie auch eine ausführliche regex

.match(/google.*microsoft|microsoft.*google/) 
+0

@ m.buettner ausgezeichneter Punkt. –

+0

Ich weiß, dass ich 'match' zweimal verwenden kann, aber ich wollte es mit regex, um es kürzer zu machen .. aber mit regex scheint es länger zu sein als mit' match' zweimal – Enve

+0

@Enve short code ist nicht unbedingt der am meisten lesbar. Vor allem, wenn der "lange" Code bereits in ein oder zwei Zeilen passt. –

6

Die anderen Antworten sind verwenden können, verwenden perfekt Gut für Ihr spezifisches Problem, aber wie Paulpro bemerkte, geraten Sie wirklich außer Kontrolle, wenn Sie mehr als zwei Wörter haben.

Der einfachste Ausweg besteht darin, mehrere Überprüfungen zu verwenden, wie es die Explosionspillen vermuten lassen.

Aber für eine skalierbare regex-only-Ansatz können Sie lookaheads verwenden:

/^(?=.*google)(?=.*microsoft)(?=.*apple).../ 

Die Look-Ahead verbrauchen nicht wirklich etwas, so nach dem ersten Zustand überprüft wird (das .*google mithalten können), sind Sie zurück am Anfang der Zeichenfolge und kann die nächste Bedingung überprüfen. Das Muster wird nur bestanden, wenn alle Lookaheads dies tun.

Beachten Sie, dass .* nicht funktioniert, wenn Ihre Eingabe Zeilenumbrüche enthalten kann. Sie müssen stattdessen [^]* oder [\s\S]* verwenden (dasselbe gilt für die Antworten der anderen).

Verwandte Themen