regex สำหรับการจับคู่บางอย่างหากไม่ได้นำหน้าอย่างอื่น


165

ดังนั้นด้วย regex ใน java ฉันต้องการเขียน regex ที่จะจับคู่หากและถ้ารูปแบบไม่ได้นำหน้าด้วยอักขระบางตัว ตัวอย่างเช่น:

String s = "foobar barbar beachbar crowbar bar ";

ฉันต้องการจับคู่หากแถบไม่ได้นำหน้าด้วย foo ดังนั้นผลลัพธ์จะเป็น:

barbar
beachbar
crowbar
bar

ฉันรู้ว่านี่อาจเป็นคำถามง่าย ๆ ฉันกำลังพยายามเรียนรู้ regex แต่ในขณะเดียวกันฉันต้องการบางสิ่งบางอย่างเพื่อทำงาน

คำตอบ:


278

คุณต้องการใช้negative lookbehindสิ่งนี้:

\w*(?<!foo)bar

ซึ่ง(?<!x)หมายความว่า "เฉพาะในกรณีที่ไม่มี" x "ก่อนหน้าจุดนี้"

ดูนิพจน์ทั่วไป -ค้นหาข้อมูลเพิ่มเติม

แก้ไข : เพิ่มการ\w*จับภาพตัวละครก่อนหน้า (เช่น "beach")


2
การแก้ไขใดที่ต้องทำให้ไม่ตรงกับ foo_arbitrary_bar ie foo ไม่ได้อยู่ก่อนแถบทันที
Brad Kent

1
@BradKent (?<!foo).*barจะตรงกับสิ่งที่ฉันเชื่อว่า
emyller

@emyller ไม่ ที่จะตรงกับ foobazbar (foo ไม่ได้มาก่อน foobazbar ดังนั้นจึงตรงกับ)
แบรดเคนต์

2
@BradKent ฉันไม่ได้อ่าน "ไม่ใช่" ใน "ไม่ตรง" ของคุณนั่นคือเหตุผลที่ฉันบอกว่ามันจะจับคู่ กรณีของคุณดูเหมือน\b(?!foo)\w*bar\bกับฉันแล้ว
emyller

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