Wyrażenie regularne do dokładnego dopasowania ciągu


153

Chcę dopasować dwa hasła za pomocą wyrażenia regularnego. Na przykład mam dwa wejścia „123456” i „1234567”, wtedy wynik nie powinien być zgodny (fałsz). A kiedy wpisałem „123456” i „123456”, wynik powinien być zgodny (prawda).

Nie mogłem zrobić miny. Jak mam to zrobić?


9
Dlaczego chcesz w tym przypadku wyrażenie regularne? Sprawdzanie (dokładnej) równości powinno naprawdę odbywać się bez wyrażenia regularnego.
Bart Kiers

Ponieważ sprawdzamy, jak zamienić tekst w skrypcie Bash i uzyskać odpowiedź, która obejmuje Perl i regex.
sudo

mając ten sam problem, lepsze rozwiązanie ^ (123456) da oczekiwane wyniki
sdx11

Możliwy duplikat całej serii Match
Omer

@canbax Dlaczego właściwie miałoby to być zabawne pytanie?
Milan Velebit

Odpowiedzi:


177

jeśli masz hasło wejściowe w zmiennej i chcesz dopasować dokładnie 123456, wtedy kotwice Ci pomogą:

/^123456$/

w perlu test na dopasowanie hasła wyglądałby podobnie

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

EDYTOWAĆ:

bart kiers ma rację, ale dlaczego nie użyjesz do tego strcmp ()? każdy język ma to na swój sposób

po drugie, możesz rozważyć bezpieczniejszy mechanizm uwierzytelniania :)


Dzięki za kotwice, wiedziałem o tym, ale kompletnie o tym nie myślałem :)
vikingsteve

2
Ważne : w Perlu i PCRE chcesz \zzamiast $. /^123456$/pasuje zarówno 123456a 123456następnie przesunięcia wiersza podczas gdy /^123456\z/tylko meczów 123456.
ikegami

154

W odpowiedzi Malfaux „^” i „$” zostały użyte do wykrycia początku i końca tekstu.
Są one zwykle używane do wykrywania początku i końca wiersza.
Jednak w tym przypadku może to być właściwy sposób.
Ale jeśli chcesz dopasować dokładne słowo, bardziej eleganckim sposobem jest użycie „\ b” . W tym przypadku następujący wzorzec będzie pasował dokładnie do wyrażenia „123456”.

/ \ b123456 \ b /


Czy jesteś pewien, że to działa w ten sposób? ;) Użyj testera regex w ten sposób . Użyj przycisku „pokaż dopasowanie”, a zobaczysz, dlaczego pasuje. BTW pamiętaj '.' jest specjalną postacią i dobrze przed nią uciec. (i dobrze pomyśleć dwa razy przed głosowaniem w dół: D).
prageeth

2
Jeśli uważasz, że moja odpowiedź jest myląca lub błędna, nadal możesz zamieścić własną odpowiedź (tak jak robią to inni ludzie) lub umieścić komentarz pod moim postem, wyjaśniający twoją sugestię.
prageeth

26
Twoja odpowiedź jest myląca i przysporzy wielu ludziom poważnych problemów. Na przykład, używając twojego podejścia, \ bhttp: //www.foo.com \ b dopasuje http://www.bar.com/?http://www.foo.com , co z pewnością nie jest dokładnym dopasowaniem, ponieważ żądane w PO. Spowoduje to poważne problemy dla osób pracujących z adresami URL lub hasłami (o co znowu prosił OP), które zawierają znaki niebędące słowami. Powinieneś wyjaśnić swoją odpowiedź, aby inni nie dali się zwieść.
0x1mason

2
Będziesz musiał wyjaśnić. '.' to czerwony śledź. \ bhttp: // www \ .foo \ .com \ b nadal tworzy dopasowanie do http://www.bar.com/?http://www.foo.com . Nie tego chce OP.
0x1mason

1
@ 0x1mason jest poprawne, które \bhttp:\/\/www.foo.com\bbędzie pasować http://www.foo.com=?http://www.foo.comwraz z adresem URL bez zmian . Pierwsza odpowiedź, używając ^(początek) i $(koniec) jest najlepszą metodą za pośrednictwem tych testerów: regex101.com i regexr.com (tester zawarty w poniższym linku nie jest zbyt przyjazny dla użytkownika, te są znacznie lepsze)
twknab

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

zapewnia to, że dopasowanie nie jest poprzedzone jakimś znakiem, cyfrą lub podkreśleniem i nie następuje bezpośrednio po nim znak lub cyfra ani podkreślenie

więc dopasuje „abc” w „abc”, „abc.”, „abc”, ale nie „4abc” ani „abcde”


1
Tytuł pytania jest mylący; próbuje upewnić się, że dwa całe struny są dokładnie takie same. Również \wpasuje zarówno cyfry jak i litery, więc [\w\d]jest zbędny.
Alan Moore

miły. zobacz regextester.com/?fam=113232 dla „skrzypiec”, które próbowałem
niezsynchronizowany

() Wokół wzorców pomogło mi.
Ghazal

6

Bardziej prostym sposobem jest sprawdzenie równości

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

jeśli jednak naprawdę chcesz trzymać się wyrażeń regularnych,

string1 =~ /^123456$/

@Kurumi Próbuję stworzyć kod java, który wyszukuje określone słowo w pliku txt i chcę użyć regx, więc czy mogę użyć tego wzorca / ^ myword $ / z String.match (/ ^ myword $ /), aby wyszukać słowo w tym txt?
Antwan

3

Można także spróbować dodanie spacji na początku i na końcu słowa kluczowego: /\s+123456\s+/i.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.