Bir dizenin tam eşleşmesi için normal ifade


158

Normal ifadeyle iki parolayı eşleştirmek istiyorum. Örneğin, "123456" ve "1234567" adlı iki girişim var, bu durumda sonuç eşleşmemelidir (yanlış). Ve "123456" ve "123456" girdiğimde sonuç eşleşmelidir (doğru).

İfadeyi yapamadım. Nasıl yaparım?


9
Bu durumda neden normal ifade istiyorsun? (Tam) eşitliği kontrol etmek gerçekten regex olmadan yapılmalıdır.
Bart Kiers

Çünkü bir Bash betiğindeki metni nasıl değiştireceğimize bakarız ve Perl ve regex içeren bir yanıt alırız.
sudo

aynı soruna sahip olmak daha iyi bir çözüm ^ (123456) istediğiniz sonuçları verecektir
sdx11


@canbax Bu neden tam olarak komik bir soru olsun?
Milan Velebit

Yanıtlar:


184

Bir değişkende bir giriş şifreniz varsa ve tam olarak 123456 ile eşleşmek istiyorsanız bağlantı noktaları size yardımcı olacaktır:

/^123456$/

perl'de şifre eşleştirme testi şu şekilde olacaktır:

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

DÜZENLE:

Barmenleri doğru, neden bunun için strcmp () kullanmıyorsunuz? her dilde kendine göre var

ikinci bir düşünce olarak, daha güvenli bir kimlik doğrulama mekanizması düşünmek isteyebilirsiniz :)


Çapalar için teşekkürler, bunu biliyordum ama tamamen düşünmedim :)
vikingsteve

2
Önemli : Perl ve PCRE'de, \zyerine $. /^123456$/hem maçları 123456ve 123456süre, bir satır arkasından /^123456\z/maçları sadece 123456.
ikegami

157

Malfaux'un cevabında '^' ve '$' metnin başlangıcını ve sonunu tespit etmek için kullanılmıştır.
Bunlar genellikle bir satırın başlangıcını ve sonunu tespit etmek için kullanılır.
Ancak bu durumda bu doğru yol olabilir.
Ancak bir kelimeyi tam olarak eşleştirmek istiyorsanız, daha şık olan yol '\ b' kullanmaktır . Bu durumda aşağıdaki kalıp, '123456 'kelime öbeğiyle tam olarak eşleşecektir.

/ \ b123456 \ b /


Bu şekilde çalıştığından emin misin? ;) Gibi bir düzenli ifade tester kullanın bu . "Eşleşmeyi göster" düğmesini kullanın ve neden eşleştiğini göreceksiniz. BTW hatırla '.' özel bir karakterdir ve ondan kaçmak iyidir. (ve olumsuz oylamadan önce iki kez düşünmek güzel: D).
prageeth

2
Cevabımın yanıltıcı veya yanlış olduğunu düşünüyorsanız, yine de kendi cevabınızı gönderebilir (diğer insanların yaptığı gibi) veya gönderimin altına önerinizi açıklayan bir yorum ekleyebilirsiniz.
prageeth

27
Cevabınız yanıltıcı ve birçok insanda ciddi sorunlara neden olacak. Örneğin, yaklaşımınızı kullanarak \ bhttp: //www.foo.com \ b, http://www.bar.com/?http://www.foo.com ile eşleşecektir ve bu kesinlikle tam bir eşleşme değildir. OP'de talep edildi. Bu, kelime olmayan karakterler içeren URL'ler veya parolalarla (yine OP'nin istediği şey) çalışan kişiler için ciddi sorunlara neden olacaktır. Başkalarının yoldan çıkmaması için cevabınızı netleştirmelisiniz.
0x1mason

2
Açıklaman gerekecek. "." kırmızı ringa balığı. \ bhttp: // www \ .foo \ .com \ b hala http://www.bar.com/?http://www.foo.com için bir eşleşme üretir . OP'nin istediği bu değil.
0x1mason

1
@ 0x1mason, URL ile olduğu gibi \bhttp:\/\/www.foo.com\beşleşecek doğru http://www.foo.com=?http://www.foo.com. İlk yanıt, ^(başlangıç) ve $(son) kullanarak bu testçiler aracılığıyla en iyi yöntemdir: regex101.com ve regexr.com (aşağıdaki bağlantıda bulunan test cihazı pek kullanıcı dostu değildir, bunlar çok daha iyidir)
twknab

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

Bu, eşleşmenizin önünde bir karakter, sayı veya alt çizgi olmadığından ve hemen ardından karakter veya sayı veya alt çizgi gelmediğinden emin olur

bu nedenle "abc", "abc.", "abc" içindeki "abc" ile eşleşecek, ancak "4abc" veya "abcde" ile eşleşmeyecektir


1
Sorunun başlığı yanıltıcıdır; iki dizenin tamamen aynı olduğundan emin olmaya çalışıyor . Ayrıca \wharflerle olduğu kadar rakamlarla da eşleşir, bu yüzden [\w\d]fazlalıktır.
Alan Moore

Güzel. bkz regextester.com/?fam=113232 "keman" i de denemek vermedi
Eşitlenmemiş

Kalıpların etrafındaki () bana yardımcı oldu.
Ghazal

6

Daha basit bir yol, eşitliği kontrol etmektir

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

ancak, normal ifadeye gerçekten bağlı kalmak istiyorsanız,

string1 =~ /^123456$/

@Kurumi txt dosyasında belirli bir kelimeyi arayan java kodu yapmaya çalışıyorum ve regx kullanmak istiyorum, böylece bu kalıbı / ^ myword $ / String.match (/ ^ myword $ /) ile kullanabilir miyim? o txt'deki kelime?
Antwan

4

Ayrıca başlangıç ve anahtar kelimenin sonuna bir boşluk ekleme deneyebilirsiniz: /\s+123456\s+/i.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.