ตัวดำเนินการ AND / OR แสดงในนิพจน์ปกติอย่างไร


220

ฉันกำลังเขียนโปรแกรมอัลกอริทึมคำศัพท์ที่ตรวจสอบว่าผู้ใช้พิมพ์คำถูกต้องหรือไม่ ฉันมีสถานการณ์ต่อไปนี้: ทางออกที่ถูกต้องสำหรับคำว่า "part1, part2" ผู้ใช้ควรป้อน "part1" (คำตอบ 1), "part2" (คำตอบ 2) หรือ "part1, part2" (คำตอบ 3) ตอนนี้ฉันพยายามจับคู่สตริงที่กำหนดโดยผู้ใช้กับนิพจน์ regex ที่สร้างขึ้นโดยอัตโนมัติ:

^(part1|part2)$

สิ่งนี้จะส่งกลับคำตอบที่ 1 และ 2 เท่านั้นว่าถูกต้องในขณะที่คำตอบ 3 จะผิด ตอนนี้ฉันสงสัยว่ามีตัวดำเนินการคล้ายกับ | หรือไม่ ที่บอกว่าแทนand/oreither...or

ใครช่วยฉันแก้ปัญหานี้ได้บ้าง


1
นิพจน์ทั่วไปอาจไม่ใช่วิธีที่ดีที่สุดสำหรับสิ่งนี้ ฉันจะใช้วิธีสตริงปกติ
เฟลิกซ์ลิ่ง

3
ปัญหานี้ระบุไว้ไม่ดี เหตุใดคุณจึงใช้การจับคู่รูปแบบเมื่อสิ่งที่คุณต้องการคือการเปรียบเทียบสตริงที่แน่นอนกับชุดของสตริงทางกฎหมาย เว้นแต่ว่าคอมไพเลอร์ regex ของคุณเพิ่มประสิทธิภาพทางเลือกในโครงสร้าง O (1) trie เช่นเดียวกับ Perl คุณควรทำการทดสอบกับการเป็นสมาชิกแฮชแทน เอนจิน regex อื่น ๆ ไม่ค่อยฉลาดเท่านี้
tchrist

@tchrist กรณีการใช้งานอาจเป็นการ$orจับคู่mongodb regex
Nadir Abbas

คำตอบ:


284

ฉันจะสมมติว่าคุณต้องการสร้าง regex แบบไดนามิกเพื่อให้มีคำอื่น ๆ นอกเหนือจากส่วนที่ 1 และส่วนที่ 2 และคุณต้องการที่จะไม่ให้คำสั่ง ถ้าเป็นเช่นนั้นคุณสามารถใช้สิ่งนี้:

((^|, )(part1|part2|part3))+$

การแข่งขันที่เป็นบวก:

part1
part2, part1
part1, part2, part3

การจับคู่เชิงลบ:

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1

4
โปรดทราบว่า "part1, part" 1 จะเป็นค่าบวกเช่นกัน ซึ่งไม่เป็นที่ต้องการเสมอไป
dimaaan

1
@dimaaan คุณใส่คำพูดของคุณผิดหรือเปล่า? "part1, part1" จะเป็นการจับคู่ แต่ "part1, part" จะไม่ตรงกัน แม้ว่าคุณจะถูกต้องว่าสถานการณ์ดังกล่าวไม่ได้ครอบคลุมโดยโซลูชันนี้สำหรับแอปพลิเคชันของ OP ที่เขาตรวจสอบว่าสตริงการทดสอบประกอบด้วยคำศัพท์ในคำศัพท์หรือไม่ฉันเชื่อว่าเขาต้องการคู่ที่เป็นบวกแม้ว่าคำนั้น ซ้ำแล้วซ้ำอีก คำนั้นจะยังคงเป็นส่วนหนึ่งของคำศัพท์ไม่ว่าคุณจะมีกี่ครั้งก็ตาม
Gaute Løken


5

มันทำงานได้โดยไม่มีการสับเปลี่ยน?

^((part)1(, \22)?)?(part2)?$

หรือเพราะเหตุใด

^((part)1(, (\22))?)?(\4)?$

คนแรกใช้ได้กับทุกเงื่อนไขครั้งที่สองสำหรับทุกคนยกเว้นpart2(ใช้ GNU sed 4.1.5)


4

ไม่ได้เป็นผู้เชี่ยวชาญใน regex, ^((part1|part2)|(part1, part2))$แต่คุณสามารถทำ ในคำ: "ส่วนที่ 1 หรือส่วนที่ 2 หรือทั้งสอง"


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