Ekspresi reguler untuk pencocokan string yang tepat


153

Saya ingin mencocokkan dua kata sandi dengan ekspresi reguler. Misalnya saya punya dua input "123456" dan "1234567" maka hasilnya harus tidak cocok (salah). Dan ketika saya telah memasukkan "123456" dan "123456" maka hasilnya harus sama (benar).

Saya tidak bisa membuat ekspresi. Bagaimana saya melakukannya?


9
Mengapa Anda ingin regex dalam hal ini? Memeriksa kesetaraan (tepat) harus benar-benar dilakukan tanpa regex.
Bart Kiers

Karena kami mencari cara mengganti teks dalam skrip Bash dan mendapatkan jawaban yang melibatkan Perl dan regex.
sudo

memiliki masalah yang sama solusi yang lebih baik ^ (123456) akan memberikan hasil yang Anda inginkan
sdx11

Kemungkinan duplikat Match whole string
Omer

@canbax Mengapa ini pertanyaan lucu?
Milan Velebit

Jawaban:


177

jika Anda memiliki kata sandi input dalam suatu variabel dan Anda ingin mencocokkan dengan tepat 123456 maka anchor akan membantu Anda:

/^123456$/

dalam perl tes untuk mencocokkan kata sandi akan menjadi seperti

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

EDIT:

bart kiers benar kan, mengapa Anda tidak menggunakan strcmp () untuk ini? setiap bahasa memilikinya dengan caranya sendiri

sebagai pemikiran kedua, Anda mungkin ingin mempertimbangkan mekanisme otentikasi yang lebih aman :)


Terima kasih untuk jangkar, saya tahu itu tetapi benar-benar tidak memikirkannya :)
vikingsteve

2
Penting : Dalam Perl dan PCRE, Anda ingin \zbukan $. /^123456$/cocok dengan keduanya 123456dan 123456diikuti oleh umpan baris, sementara /^123456\z/hanya cocok 123456.
ikegami

154

Dalam jawaban malfaux '^' dan '$' telah digunakan untuk mendeteksi awal dan akhir teks.
Ini biasanya digunakan untuk mendeteksi awal dan akhir suatu garis.
Namun ini mungkin cara yang benar dalam kasus ini.
Tetapi jika Anda ingin mencocokkan kata yang tepat, cara yang lebih elegan adalah menggunakan '\ b' . Dalam kasus ini, pola berikut akan cocok dengan frasa persis '123456 '.

/ \ b123456 \ b /


Apakah Anda yakin itu berfungsi seperti itu? ;) Silakan gunakan regex tester seperti ini . Gunakan tombol "tampilkan yang cocok" dan Anda akan melihat mengapa itu cocok. BTW ingat '.' adalah char khusus dan bagus untuk menghindarinya. (dan baik untuk berpikir dua kali sebelum turun voting: D).
Prageeth

2
Jika Anda berpikir jawaban saya menyesatkan atau salah, Anda masih dapat memposting jawaban Anda sendiri (seperti yang dilakukan orang lain) atau memberikan komentar di bawah posting saya yang menjelaskan saran Anda.
Prageeth

26
Jawaban Anda menyesatkan dan akan menyebabkan banyak masalah serius bagi banyak orang. Misalnya, menggunakan pendekatan Anda \ bhttp: //www.foo.com \ b akan cocok dengan http://www.bar.com/?http://www.foo.com , yang pasti bukan pencocokan persis, karena diminta dalam OP. Ini akan menyebabkan masalah serius bagi orang yang bekerja dengan URL atau kata sandi (yang, sekali lagi, adalah apa yang diminta OP) yang mengandung karakter bukan kata. Anda harus mengklarifikasi jawaban Anda sehingga orang lain tidak tersesat.
0x1mason

2
Anda harus menjelaskan. '.' adalah herring merah. \ bhttp: // www \ .foo \ .com \ b masih menghasilkan kecocokan untuk http://www.bar.com/?http://www.foo.com . Bukan itu yang diinginkan OP.
0x1 bulan

1
@ 0x1mason benar yang \bhttp:\/\/www.foo.com\bakan cocok http://www.foo.com=?http://www.foo.comdengan URL apa adanya. Respons pertama, menggunakan ^(awal) dan $(akhir) adalah metode terbaik melalui penguji ini: regex101.com dan regexr.com (tester yang disertakan dalam tautan di bawah ini tidak sangat ramah pengguna, ini jauh lebih baik)
twknab

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

ini memastikan bahwa pertandingan Anda tidak didahului oleh beberapa karakter, angka, atau garis bawah dan tidak segera diikuti oleh karakter atau angka, atau garis bawah

jadi itu akan cocok dengan "abc" di "abc", "abc.", "abc", tetapi tidak "4abc", atau "abcde"


1
Judul pertanyaan itu menyesatkan; dia berusaha memastikan dua utas utuh sama persis. Selain itu, \wcocok dengan digit serta huruf, jadi [\w\d]mubazir.
Alan Moore

bagus. lihat regextester.com/?fam=113232 untuk "biola" yang saya lakukan untuk mencobanya
tidak disinkronkan

Pola () di sekitar membantu saya.
Ghazal

6

Cara yang lebih lurus ke depan adalah memeriksa kesetaraan

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

namun, jika Anda benar-benar ingin tetap berpegang pada ekspresi reguler,

string1 =~ /^123456$/

@ Kurumi Saya mencoba membuat kode java yang mencari kata tertentu dalam file txt dan saya ingin menggunakan regx jadi saya bisa menggunakan pola / ^ myword $ / with String.match (/ ^ myword $ /) untuk mencari kata dalam txt itu?
Antwan

3

Anda juga dapat mencoba menambahkan ruang pada awal dan akhir kata kunci: /\s+123456\s+/i.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.