Wie ordne ich eine ganze Zeichenfolge einem regulären Ausdruck zu?

82

Ich benötige einen regulären Ausdruck, der nur Übereinstimmungen findet, bei denen die gesamte Zeichenfolge mit meiner Abfrage übereinstimmt.

Wenn ich beispielsweise nach Filmen mit dem Namen "Red October" suche, möchte ich nur genau diesen Titel finden (ohne Berücksichtigung der Groß- und Kleinschreibung), aber keine Titel wie "The Hunt For Red October". Ich bin mir nicht ganz sicher, wie ich das machen soll. Weiß jemand?

Vielen Dank!

Micah
quelle
1
Warum brauchen Sie eine Regex für etwas, für das ein einfaches string.Containsfunktioniert?
Oded
1
Der Grund, warum ich einen regulären Ausdruck verwenden muss, ist, dass ich ihn für eine Suche in MongoDB verwende und dass die Groß- und Kleinschreibung nicht berücksichtigt werden muss, was nur mit einem regulären Ausdruck möglich ist
Micah,
Warum nicht (on-fly) DB-Daten für die Suche in Kleinbuchstaben und Benutzer-Kleinbuchstaben konvertieren?
Greenoldman
1
@macias Ich bin nicht anderer Meinung, dass es eine bessere Option wäre, aber leider erlaubt meine aktuelle Situation dies nicht.
Micah
Zu Ihrer Information: Wenn Sie keinen regulären Ausdruck benötigen und nur versuchen, zwei Zeichenfolgen zu vergleichen, ohne die Groß- und Kleinschreibung zu beachten, können Sie dies einfach tunstring1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve

Antworten:

110

Versuchen Sie den folgenden regulären Ausdruck:

^Red October$

Standardmäßig wird bei regulären Ausdrücken zwischen Groß- und Kleinschreibung unterschieden. Das ^markiert den Anfang des übereinstimmenden Textes und $das Ende.

Pieter van Ginkel
quelle
1
Zu Ihrer Information, erwähnen Sie, dass Sie beim Erstellen eines Regex-Objekts den zweiten Parameter RegexOptions.IgnoreCase hinzufügen, um die Groß- und Kleinschreibung nicht zu berücksichtigen.
ToolmakerSteve
Dies funktioniert nicht, wenn diese Zeichenfolge noch von etwas anderem umgeben ist. Wenn Sie beispielsweise wie in Street nach "St" gesucht haben, aber andere Zeichenfolgen in derselben Zeile haben, die ebenfalls mit "St" beginnen, wie z. B. der Name "Stirling", stimmt diese Regex nicht genau überein. Ich bin mir leider nicht sicher, ob RegEx die richtige Antwort für dieses Szenario ist. Ich werde es trotzdem weiter versuchen. Tims Antwort unten ist gut, aber nicht alle Motoren unterstützen dies.
Legasthenikeraboko
Tatsächlich $stimmt nicht immer mit dem Ende der Zeichenfolge überein, \zentspricht ( \Zist das Äquivalent in Python). Bitte lesen Sie die Antwort von Tim Pietzcker . Dies gilt jedoch für JavaScript.
Wiktor Stribiżew
40

Im Allgemeinen und mit den Standardeinstellung, ^und $Anker ist ein guter Weg , um sicherzustellen , dass ein regulärer Ausdruck eine ganze Zeichenfolge übereinstimmt.

Ein paar Einschränkungen:

Wenn Ihre Regex eine Abwechslung aufweist, müssen Sie Ihre Regex in eine nicht erfassende Gruppe einschließen, bevor Sie sie mit ^und umgeben $:

^foo|bar$

ist natürlich anders als

^(?:foo|bar)$

Außerdem ^und $kann eine andere Bedeutung annehmen (Anfang / Ende der Zeile anstelle von Anfang / Ende der Zeichenfolge ), wenn bestimmte Optionen festgelegt sind. In Texteditoren, die reguläre Ausdrücke unterstützen, ist dies normalerweise das Standardverhalten. In einigen Sprachen, insbesondere in Ruby, kann dieses Verhalten nicht einmal ausgeschaltet werden.

Daher gibt es einen weiteren Satz von Ankern, die garantiert nur am Anfang / Ende der gesamten Zeichenfolge übereinstimmen:

\A stimmt am Anfang der Zeichenfolge überein.

\Z Übereinstimmungen am Ende der Zeichenfolge oder vor einem letzten Zeilenumbruch.

\z stimmt ganz am Ende der Zeichenfolge überein.

Aber nicht alle Sprachen unterstützen diese Anker, insbesondere JavaScript.

Tim Pietzcker
quelle
4
Dies ist die hilfreichste Antwort
Jeremy Danyow
18

Verwenden Sie die ^$ Modifikatoren und , um anzugeben, wo sich das Regex-Muster relativ zum Anfang und Ende der Zeichenfolge befindet:

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail
Tim Robinson
quelle
10

Ich weiß, dass es etwas spät sein kann, dies zu beantworten, aber vielleicht ist es für jemand anderen nützlich.

Einfachster Weg:

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}
Zixav
quelle
2
IMHO ist dies WENIGER einfach als die akzeptierte Antwort. Aber es ist eine Alternative.
ToolmakerSteve
Ich mag diese Antwort, weil der Code selbst das beabsichtigte Verhalten zeigt, anstatt den regulären Ausdruck zu ändern (was für jemanden, der mit wenig Verständnis des regulären Ausdrucks auf den Code blickt, möglicherweise weniger klar ist). Das mögliche Problem besteht darin, dass der reguläre Ausdruck so geschrieben werden kann, dass er entweder mit der gesamten Zeichenfolge oder einem Teil davon übereinstimmt, wobei die Regex.Match-Funktion die teilweise Übereinstimmung zurückgibt, obwohl eine vollständige Übereinstimmung möglich ist.
John Thoits
8

Sie müssen Ihren regulären Ausdruck in ^(Anfang der Zeichenfolge) und $(Ende der Zeichenfolge) einschließen :

^Red October$
Anton Gogolev
quelle
0

Entschuldigung, aber das ist etwas unklar.

Nach dem, was ich gelesen habe, möchten Sie einen einfachen String-Vergleich durchführen. Dafür brauchen Sie keinen regulären Ausdruck.

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());
Dean Thomas
quelle
1
Der Grund, warum ich einen regulären Ausdruck verwenden muss, ist, dass ich ihn für eine Suche in MongoDB verwende und die Groß- und Kleinschreibung nicht berücksichtigen muss, was nur mit einem regulären Ausdruck möglich ist.
Micah
-1

Sie können es wie in diesem Beispiel tun, wenn ich nur einmal den Buchstaben minus a in einer Zeichenfolge abfangen möchte und es mit myRegex.IsMatch () überprüft werden kann.

^ [^ e] [e] {1} [^ e] $

Vincent Roy
quelle