Regulärer Ausdruck für die genaue Übereinstimmung einer Zeichenfolge


153

Ich möchte zwei Passwörter mit regulären Ausdrücken abgleichen. Zum Beispiel habe ich zwei Eingänge "123456" und "1234567", dann sollte das Ergebnis nicht übereinstimmen (false). Und wenn ich "123456" und "123456" eingegeben habe, sollte das Ergebnis übereinstimmen (true).

Ich konnte den Ausdruck nicht machen. Wie mache ich es?


9
Warum möchten Sie in diesem Fall Regex? Die Überprüfung auf (genaue) Gleichheit sollte wirklich ohne Regex erfolgen.
Bart Kiers

Weil wir nachschlagen, wie Text in einem Bash-Skript ersetzt wird, und eine Antwort erhalten, die Perl und Regex umfasst.
Sudo

Wenn

Mögliches Duplikat von Match ganze Zeichenfolge
Omer

1
Warum hat diese lustige Frage so viele positive Stimmen?
canbax

Antworten:


176

Wenn Sie ein Eingabekennwort in einer Variablen haben und genau mit 123456 übereinstimmen möchten, helfen Ihnen Anker:

/^123456$/

In Perl wäre der Test zum Abgleichen des Passworts so etwas wie

print "MATCH_OK" if ($input_pass=~/^123456$/);

BEARBEITEN:

bart kiers ist richtig tho, warum benutzt du dafür nicht ein strcmp ()? Jede Sprache hat es auf ihre Weise

Als zweiten Gedanken möchten Sie vielleicht einen sichereren Authentifizierungsmechanismus in Betracht ziehen :)


Danke für die Anker, das wusste ich, habe aber überhaupt nicht darüber
nachgedacht

2
Wichtig : In Perl und PCRE möchten Sie \zstatt $. /^123456$/stimmt mit beiden überein 123456und wird 123456von einem Zeilenvorschub gefolgt, während /^123456\z/nur übereinstimmt 123456.
Ikegami

154

In Malfaux 'Antwort wurden ' ^ ' und ' $ ' verwendet, um den Anfang und das Ende des Textes zu erkennen.
Diese werden normalerweise verwendet, um den Anfang und das Ende einer Zeile zu erkennen.
Dies kann jedoch in diesem Fall der richtige Weg sein.
Wenn Sie jedoch ein genaues Wort finden möchten, ist es eleganter, '\ b' zu verwenden . In diesem Fall entspricht das folgende Muster genau der Phrase '123456'.

/ \ b123456 \ b /


Sind Sie sicher, dass es so funktioniert? ;) Bitte benutze einen Regex-Tester wie diesen . Verwenden Sie die Schaltfläche "Übereinstimmung anzeigen" und Sie werden sehen, warum es übereinstimmt. Übrigens erinnere mich an '.' ist ein besonderer Char und gut, um ihm zu entkommen. (und gut zu überlegen, bevor Sie abstimmen: D).
Prageeth

2
Wenn Sie der Meinung sind, dass meine Antwort irreführend oder falsch ist, können Sie trotzdem Ihre eigene Antwort posten (wie andere Leute) oder einen Kommentar unter meinen Beitrag einfügen, in dem Ihr Vorschlag erläutert wird.
Prageeth

26
Ihre Antwort ist irreführend und wird vielen Menschen ernsthafte Probleme bereiten. Wenn Sie beispielsweise Ihren Ansatz verwenden, stimmt \ bhttp: //www.foo.com \ b mit http://www.bar.com/?http://www.foo.com überein , was definitiv keine exakte Übereinstimmung ist im OP angefordert. Dies führt zu ernsthaften Problemen für Personen, die mit URLs oder Kennwörtern arbeiten (was wiederum vom OP angefordert wird), die Nicht-Wort-Zeichen enthalten. Sie sollten Ihre Antwort klarstellen, damit andere nicht in die Irre geführt werden.
0x1mason

2
Du musst es erklären. '.' ist ein roter Hering. \ bhttp: // www \ .foo \ .com \ b erzeugt immer noch eine Übereinstimmung für http://www.bar.com/?http://www.foo.com . Das will das OP nicht.
0x1mason

1
@ 0x1mason ist korrekt und stimmt mit der URL unverändert \bhttp:\/\/www.foo.com\büberein http://www.foo.com=?http://www.foo.com. Die erste Antwort mit ^(Anfang) und $(Ende) ist die beste Methode über diese Tester: regex101.com und regexr.com (der in einem Link unten enthaltene Tester ist nicht sehr benutzerfreundlich, diese sind viel besser)
twknab

33
(?<![\w\d])abc(?![\w\d])

Dadurch wird sichergestellt, dass Ihrer Übereinstimmung kein Zeichen, keine Zahl oder kein Unterstrich vorangestellt ist und nicht sofort ein Zeichen, eine Zahl oder ein Unterstrich folgt

so wird es mit "abc" in "abc", "abc.", "abc", aber nicht mit "4abc" oder "abcde" übereinstimmen.


1
Der Titel der Frage ist irreführend; Er versucht sicherzustellen, dass zwei ganze Saiten genau gleich sind. Stimmt auch \wmit Ziffern und Buchstaben überein, [\w\d]ist also redundant.
Alan Moore

nett. Siehe regextester.com/?fam=113232 für "Geige", die ich gemacht habe, um es auszuprobieren
synchronisiert

Das () um Muster hat mir geholfen.
Ghazal

6

Ein direkterer Weg ist die Überprüfung der Gleichheit

if string1 == string2
  puts "match"
else
  puts "not match"
end

Wenn Sie sich jedoch wirklich an den regulären Ausdruck halten möchten,

string1 =~ /^123456$/

@Kurumi Ich versuche Java-Code zu erstellen, der nach einem bestimmten Wort in der TXT-Datei sucht, und ich möchte regx verwenden. Könnte ich dieses Muster / ^ myword $ / mit String.match (/ ^ myword $ /) verwenden, um nach dem zu suchen? Wort in diesem Text?
Antwan

3

Sie können auch versuchen, ein Leerzeichen am Anfang und Ende des Schlüsselworts anzuhängen : /\s+123456\s+/i.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.