Biểu thức chính quy cho khớp chính xác của chuỗi


153

Tôi muốn khớp hai mật khẩu với biểu thức chính quy. Ví dụ: tôi có hai đầu vào "123456" và "1234567" thì kết quả sẽ không khớp (sai). Và khi tôi đã nhập "123456" và "123456" thì kết quả sẽ khớp (đúng).

Tôi không thể làm cho biểu hiện. Tôi phải làm nó như thế nào?


9
Tại sao bạn muốn regex trong trường hợp này? Kiểm tra sự bình đẳng (chính xác) nên thực sự được thực hiện mà không cần regex.
Bart Kiers

Bởi vì chúng tôi tìm cách thay thế văn bản trong tập lệnh Bash và nhận được câu trả lời liên quan đến Perl và regex.
sudo

có cùng một vấn đề, một giải pháp tốt hơn ^ (123456) sẽ cho kết quả mà bạn muốn
sdx11

Bản sao có thể có của toàn bộ chuỗi Kết hợp
Omer

@canbax Tại sao đây sẽ là một câu hỏi vui chính xác?
Milan Velebit

Câu trả lời:


177

nếu bạn có mật khẩu đầu vào trong một biến và bạn muốn khớp chính xác 123456 thì các neo sẽ giúp bạn:

/^123456$/

trong perl bài kiểm tra để khớp mật khẩu sẽ giống như

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

BIÊN TẬP:

bart kiers là đúng tho, tại sao bạn không sử dụng strcmp () cho việc này? mỗi ngôn ngữ có nó theo cách riêng của nó

như một suy nghĩ thứ hai, bạn có thể muốn xem xét một cơ chế xác thực an toàn hơn :)


Cảm ơn các mỏ neo, tôi biết điều đó nhưng hoàn toàn không nghĩ về nó :)
vikingsteve

2
Quan trọng : Trong Perl và PCRE, bạn muốn \zthay vì $. /^123456$/khớp cả hai 123456123456theo sau là một nguồn cấp dữ liệu, trong khi /^123456\z/chỉ khớp 123456.
ikegami

154

Trong câu trả lời của malfaux '^''$' đã được sử dụng để phát hiện phần đầu và phần cuối của văn bản.
Chúng thường được sử dụng để phát hiện đầu và cuối của một dòng.
Tuy nhiên đây có thể là cách chính xác trong trường hợp này.
Nhưng nếu bạn muốn ghép một từ chính xác, cách thanh lịch hơn là sử dụng '\ b' . Trong trường hợp này, mẫu sau sẽ khớp với cụm từ chính xác'123456 '.

/ \ b123456 \ b /


Bạn có chắc chắn rằng nó hoạt động theo cách đó? ;) Vui lòng sử dụng một trình kiểm tra regex như thế này . Sử dụng nút "hiển thị khớp" và bạn sẽ thấy lý do tại sao nó khớp. BTW nhớ '.' là một char đặc biệt và tốt để thoát khỏi nó. (và tốt để suy nghĩ hai lần trước khi bỏ phiếu: D).
prageeth

2
Nếu bạn nghĩ rằng câu trả lời của tôi là sai lệch hoặc sai, bạn vẫn có thể đăng câu trả lời của riêng bạn (như những người khác làm) hoặc đặt một bình luận dưới bài đăng của tôi giải thích đề xuất của bạn.
hãy can đảm vào

26
Câu trả lời của bạn là sai lệch và sẽ khiến nhiều người gặp vấn đề nghiêm trọng. Ví dụ: sử dụng phương pháp của bạn \ bhttp: //www.foo.com \ b sẽ khớp với http://www.bar.com/?http://www.foo.com , đây chắc chắn không phải là một kết hợp chính xác, vì được yêu cầu trong OP. Điều này sẽ gây ra vấn đề nghiêm trọng cho những người làm việc với URL hoặc mật khẩu (một lần nữa, đó là những gì OP yêu cầu) có chứa các ký tự không phải từ. Bạn nên làm rõ câu trả lời của mình để những người khác không bị lạc lối.
0x1mason

2
Bạn sẽ phải giải thích. '.' là một cá trích đỏ. \ bhttp: // www \ .foo \ .com \ b vẫn tạo ra một trận đấu cho http://www.bar.com/?http://www.foo.com . Đó không phải là điều OP muốn.
0x1mason

1
@ 0x1mason là chính xác \bhttp:\/\/www.foo.com\bsẽ khớp http://www.foo.com=?http://www.foo.comvới URL. Phản hồi đầu tiên, sử dụng ^(bắt đầu) và $(kết thúc) là phương pháp tốt nhất thông qua những người thử nghiệm này: regex101.comregexr.com (người kiểm tra có trong một liên kết bên dưới không thân thiện với người dùng, những điều này tốt hơn nhiều)
twknab

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

điều này đảm bảo rằng trận đấu của bạn không được bắt đầu bởi một số ký tự, số hoặc dấu gạch dưới và không được theo dõi ngay lập tức bởi ký tự hoặc số hoặc gạch dưới

vì vậy nó sẽ khớp với "abc" trong "abc", "abc.", "abc", nhưng không phải "4abc", cũng không phải "abcde"


1
Tiêu đề của câu hỏi là sai lệch; anh ta đang cố gắng đảm bảo hai chuỗi hoàn toàn giống nhau. Ngoài ra, \wkhớp các chữ số cũng như các chữ cái, vì vậy [\w\d]là dư thừa.
Alan Moore

đẹp. xem regextester.com/?fam=113232 để biết "fiddle" tôi đã dùng thử
không đồng bộ hóa vào

() Xung quanh các mẫu đã giúp tôi.
Ghazal

6

Một cách đơn giản hơn là kiểm tra sự bình đẳng

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

tuy nhiên, nếu bạn thực sự muốn giữ biểu thức chính quy,

string1 =~ /^123456$/

@Kurumi Tôi đang cố gắng tạo mã java tìm kiếm từ cụ thể trong tệp txt và tôi muốn sử dụng regx vì vậy tôi có thể sử dụng mẫu đó / ^ myword $ / với String.match (/ ^ myword $ /) để tìm kiếm từ trong txt đó?
Antwan

3

Bạn cũng có thể thử nối thêm khoảng trắng ở đầu và cuối từ khóa : /\s+123456\s+/i.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.