นิพจน์ปกติสำหรับการจับคู่ที่ตรงกันของสตริง


153

ฉันต้องการจับคู่สองรหัสผ่านกับนิพจน์ทั่วไป ตัวอย่างเช่นฉันมีสองอินพุต "123456" และ "1234567" ดังนั้นผลลัพธ์ควรไม่ตรงกัน (false) และเมื่อฉันป้อน "123456" และ "123456" ผลลัพธ์ควรตรงกัน (จริง)

ฉันไม่สามารถแสดงออกได้ ฉันต้องทำอย่างไร?


9
ทำไมคุณต้องการ regex ในกรณีนี้ การตรวจสอบความเท่าเทียมกัน (ที่แน่นอน) ควรทำโดยไม่ต้อง regex
Bart Kiers

เนื่องจากเราค้นหาวิธีการแทนที่ข้อความในสคริปต์ Bash และรับคำตอบที่เกี่ยวข้องกับ Perl และ regex
sudo

มีปัญหาเดียวกันทางออกที่ดีกว่า ^ (123456) จะให้ผลลัพธ์ที่คุณต้องการ
sdx11

มีความเป็นไปได้ที่ซ้ำกันของการจับคู่สตริงทั้งหมด
Omer

@canbax ทำไมนี้เป็นคำถามที่ตลกอย่างแน่นอน
Milan Velebit

คำตอบ:


177

หากคุณมีรหัสผ่านสำหรับป้อนข้อมูลในตัวแปรและคุณต้องการจับคู่ที่ตรงกัน 123456 จุดยึดจะช่วยให้คุณ:

/^123456$/

ใน Perl การทดสอบสำหรับการจับคู่รหัสผ่านจะเป็นสิ่งที่ต้องการ

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

แก้ไข:

บาร์ต kiersถูกต้องทำไมคุณไม่ใช้ strcmp () สำหรับสิ่งนี้? ทุกภาษามีในแบบของตัวเอง

เป็นความคิดที่สองคุณอาจต้องการพิจารณากลไกการรับรองความถูกต้องปลอดภัยกว่า :)


ขอบคุณสำหรับการเบรกฉันรู้ว่า แต่อย่างสมบูรณ์ไม่ได้คิดเกี่ยวกับมัน :)
vikingsteve

2
สำคัญ : ใน Perl และ PCRE ที่คุณต้องการแทน \z ตรงกับทั้งสองและตามด้วยอาหารเส้นในขณะที่การแข่งขันเท่านั้น $/^123456$/123456123456/^123456\z/123456
ikegami

154

ในคำตอบที่ผิดปกติ'^'และ'$'ถูกใช้เพื่อตรวจจับจุดเริ่มต้นและจุดสิ้นสุดของข้อความ
โดยปกติจะใช้เพื่อตรวจจับจุดเริ่มต้นและจุดสิ้นสุดของบรรทัด
อย่างไรก็ตามนี่อาจเป็นวิธีที่ถูกต้องในกรณีนี้
แต่ถ้าคุณต้องการที่จะตรงกับคำที่แน่นอนวิธีที่สง่างามมากขึ้นคือการใช้'\ b' ในกรณีนี้รูปแบบต่อไปนี้จะตรงกับวลีที่แน่นอน '123456'

/ \ b123456 \ b /


คุณแน่ใจหรือว่ามันใช้งานได้ในลักษณะนั้น? ;) โปรดใช้ทดสอบ regex เช่นนี้ ใช้ปุ่ม "แสดงรายการที่ตรงกัน" แล้วคุณจะเห็นว่าเหตุใดจึงตรงกัน BTW จำ '.' เป็นคนพิเศษและดีที่จะหลบหนี (และดีที่จะคิดสองครั้งก่อนลงคะแนน: D)
prageeth

2
หากคุณคิดว่าคำตอบของฉันทำให้เข้าใจผิดหรือผิดคุณยังสามารถโพสต์คำตอบของคุณเอง (เหมือนคนอื่น ๆ ) หรือแสดงความคิดเห็นภายใต้โพสต์ของฉันเพื่ออธิบายคำแนะนำของคุณ
prageeth

26
คำตอบของคุณทำให้เข้าใจผิดและจะทำให้เกิดปัญหาร้ายแรงหลายคน เช่นการใช้วิธีการของคุณ \ bhttp: //www.foo.com \ b จะจับคู่กับhttp://www.bar.com/?http://www.foo.comซึ่งแน่นอนที่สุดไม่ใช่การแข่งขันที่แน่นอน ร้องขอใน OP สิ่งนี้จะทำให้เกิดปัญหาร้ายแรงสำหรับผู้ที่ทำงานกับ URL หรือรหัสผ่าน (ซึ่งอีกครั้งคือสิ่งที่ OP ร้องขอ) ที่มีอักขระที่ไม่ใช่คำ คุณควรชี้แจงคำตอบของคุณให้ชัดเจนเพื่อไม่ให้คนอื่นหลงทาง
0x1mason

2
คุณจะต้องอธิบาย '' เป็นปลาเฮอริ่งแดง \ bHTTP: // www \ .foo \ .com \ ขยังก่อให้เกิดการแข่งขันสำหรับhttp://www.bar.com/?http://www.foo.com นั่นไม่ใช่สิ่งที่ OP ต้องการ
0x1mason

1
@ 0x1mason ถูกต้องที่\bhttp:\/\/www.foo.com\bจะจับคู่http://www.foo.com=?http://www.foo.comกับ URL ตามที่เป็นอยู่ การตอบกลับครั้งแรกโดยใช้^(เริ่มต้น) และ$(สิ้นสุด) เป็นวิธีที่ดีที่สุดผ่านผู้ทดสอบเหล่านี้: regex101.comและregexr.com (ผู้ทดสอบที่รวมอยู่ในลิงก์ด้านล่างนี้ไม่ได้ใช้งานง่ายมากผู้ใช้เหล่านี้ดีกว่ามาก)
twknab

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

สิ่งนี้ทำให้แน่ใจได้ว่าการจับคู่ของคุณไม่ได้นำหน้าด้วยอักขระตัวเลขหรือขีดเส้นใต้และไม่ได้ตามด้วยอักขระหรือหมายเลขหรือขีดล่าง

ดังนั้นจึงจะตรงกับ "abc" ใน "abc", "abc.", "abc" แต่ไม่ใช่ "4abc" หรือ "abcde"


1
ชื่อของคำถามนั้นทำให้เข้าใจผิด; เขาพยายามที่จะทำให้แน่ใจว่าทั้งสองสายเหมือนกันทั้งหมด นอกจากนี้ยัง\wจับคู่ตัวเลขและตัวอักษรดังนั้นจึง[\w\d]ซ้ำซ้อน
อลันมัวร์

ดี ดูregextester.com/?fam=113232สำหรับ "ซอ" ฉันลองทำดูสิ
unsynchronized

() รอบลวดลายช่วยฉัน
Ghazal

6

วิธีที่ตรงไปตรงมามากขึ้นคือการตรวจสอบความเท่าเทียมกัน

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

อย่างไรก็ตามถ้าคุณต้องการที่จะยึดติดกับการแสดงออกปกติ

string1 =~ /^123456$/

@ คุรุมิฉันพยายามสร้างรหัสจาวาที่ค้นหาคำเฉพาะในไฟล์ txt และฉันต้องการใช้ regx ดังนั้นฉันสามารถใช้รูปแบบนั้น / ^ myword $ / ด้วย String.match (/ ^ myword $ /) เพื่อค้นหา คำใน txt ที่?
Antwan

3

/\s+123456\s+/iนอกจากนี้คุณยังอาจพยายามผนวกพื้นที่ที่เริ่มต้นและจุดสิ้นสุดของคำหลัก:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.