ฉันสามารถใช้ OR ใน regex โดยไม่จับสิ่งที่แนบมาได้หรือไม่?


116

ฉันใช้rubular.comเพื่อสร้าง regex และเอกสารของพวกเขาอธิบายสิ่งต่อไปนี้:

(...)   Capture everything enclosed
(a|b)   a or b

ฉันจะใช้นิพจน์ OR โดยไม่จับสิ่งที่อยู่ในนั้นได้อย่างไร ตัวอย่างเช่นพูดว่าฉันต้องการจับภาพ "ac" หรือ "bc" ฉันใช้นิพจน์ทั่วไปไม่ได้

(a|b)(c)

ขวา? ตั้งแต่นั้นมาฉันก็จับ "a" หรือ "b" ในกลุ่มหนึ่งและ "c" ในอีกกลุ่มหนึ่งไม่เหมือนกัน ฉันรู้ว่าฉันสามารถกรองผลการค้นหาได้ แต่ดูเหมือนว่าจะได้ผลมากกว่า ...

ฉันขาดอะไรบางอย่างที่ชัดเจนหรือไม่? ฉันใช้สิ่งนี้ใน Java หากเป็นไปตามนั้น


ดี +1 สำหรับลิงค์ไปยัง rubular
bukowski

คำตอบ:


182

ขึ้นอยู่กับการใช้งานนิพจน์ทั่วไปคุณสามารถใช้สิ่งที่เรียกว่ากลุ่มที่ไม่ได้จับภาพด้วยไวยากรณ์(?:…):

((?:a|b)c)

นี่(?:a|b)คือกลุ่ม แต่คุณไม่สามารถอ้างอิงการจับคู่ได้ ดังนั้นคุณสามารถอ้างอิงได้เฉพาะการจับคู่((?:a|b)c)ที่เป็นacหรือbcเท่านั้น


นั่นมัน! ขอบคุณสำหรับการตอบกลับที่รวดเร็วเป็นพิเศษ ฉันจะยอมรับหลังจากเวลาที่กำหนด (ซึ่งฉันไม่รู้ว่ามีอยู่) หมดลง
goggin13

4
ฉันคิดว่าความคิดนั้นไม่ใช่เพื่อจับภาพaหรือbทั้งหมด ในคำอื่น ๆ ที่จะตรง acหรือbcแต่เพียงจับc :(?:a|b)(c)
อลันมัวร์

1
@AlanMoore เป็นไปได้หรือไม่ที่จะจับหนึ่งและไม่จับอีกคนหนึ่งในคำสั่งหรือ? ดังนั้นฉันกำลังมองหารูปแบบacหรือabแต่ฉันต้องการเอาต์พุตabถ้าเอาต์พุตab'c' เท่านั้นคือ 'ac'
Moondra

24

หากการติดตั้งของคุณมีคุณสามารถใช้วงเล็บที่ไม่จับภาพ:

(?:a|b)

@mmutz ขอบคุณสำหรับการตอบกลับที่รวดเร็ว! ฉันหวังว่าฉันจะยอมรับทั้งสองคำตอบนั่นคือสิ่งที่ฉันกำลังมองหา
goggin13

3

แม้แต่รูรูลาร์ก็ไม่ทำให้คุณใช้วงเล็บและลำดับความสำคัญ|ต่ำ ตัวอย่างเช่นa | bc ไม่ตรงกับ ccc


ตัวดำเนินการ "! ~" ทำอะไร ฉันชอบการแสดงออกของคุณโดยมี parens น้อยลง regex ก็ยุ่งพอแล้ว
goggin13

! ~ เป็น perlism สำหรับ "ไม่ตรงกัน" มันเป็นงานเขียนเลอะเทอะในส่วนของฉัน; คงขอบคุณ
msw

2
ฉันไม่เข้าใจคุณ ความสำคัญต่ำ|คือเหตุผลที่คุณไม่ต้องใช้ parens (?:a|b)cแมตช์acหรือbc(พฤติกรรมที่ต้องการ) ในขณะที่a|bcการแข่งขันหรือa bc
อลันมัวร์

2

หากตัวเลือก OR ของคุณเป็นอักขระเดี่ยวทั้งหมดคุณสามารถใช้ตัวดำเนินการ "ชุดอักขระ" ได้ดังนี้

([ab]c)

มันจะตรงกันacหรือbcและอ่านง่ายขึ้น

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