Regex วิธีจับคู่อักขระที่ไม่จำเป็น


147

ฉันมี regex ที่ฉันคิดว่าทำงานได้อย่างถูกต้องจนถึงตอนนี้ ฉันต้องการจับคู่กับอักขระที่ไม่จำเป็น มันอาจจะมีหรือไม่

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

ฉันต้องการรับตัวอักษรตัวเดียวหลังจากตัวเลข 5 ตัวเริ่มต้นถ้ามันอยู่ที่นั่นและหากไม่ได้รับสายอื่น จดหมายนี้สามารถA-Zจดหมายฉบับนี้สามารถ

ถ้าฉันลบออก([A-Z]{1}) +.*? +จาก regex มันจะตรงกับทุกสิ่งที่ฉันต้องการยกเว้นตัวอักษร แต่มันสำคัญมาก

20000      K               Q511195DREWBT            E00078748521
30000                      K601220PLOPOH            Z00054878524

นี่คือ regex ที่ฉันใช้

/^([0-9]{5})+.*? ([A-Z]{1}) +.*? +([A-Z]{1})([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3}) +([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})/

คำตอบ:


246

ใช้

[A-Z]?

เพื่อทำให้จดหมายเป็นตัวเลือก {1}ซ้ำซ้อน (แน่นอนคุณสามารถเขียน[A-Z]{0,1}ซึ่งจะหมายถึงเหมือนกัน แต่นั่นคือสิ่งที่?มีสำหรับ)

คุณสามารถปรับปรุง regex ของคุณเป็น

^([0-9]{5})+\s+([A-Z]?)\s+([A-Z])([0-9]{3})([0-9]{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])[0-9]{3}([0-9]{4})([0-9]{2})([0-9]{2})

และเนื่องจากในภาษา regex ส่วนใหญ่\dเป็นเช่นเดียวกับ[0-9]:

^(\d{5})+\s+([A-Z]?)\s+([A-Z])(\d{3})(\d{3})([A-Z]{3})([A-Z]{3})\s+([A-Z])\d{3}(\d{4})(\d{2})(\d{2})

แต่: คุณต้องการกลุ่มจับแยก 11 กลุ่มจริงหรือไม่? และถ้าเป็นเช่นนั้นทำไมคุณไม่จับกลุ่มตัวเลขสี่ถึงสุดท้าย?


ทิมฉันไม่แน่ใจจริงๆว่าฉันไม่ได้เขียน regex นี้ ฉันยังใหม่กับ regex อยู่ หากคุณเห็นวิธีการเขียนที่ดีกว่านี้ฉันเปิดรับข้อเสนอแนะ
จิม

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

26

คุณสามารถทำให้ตัวอักษรตัวเดียวโดยการเพิ่ม?หลังจากนั้นเป็น:

([A-Z]{1}?)

ปริมาณ{1}นั้นซ้ำซ้อนดังนั้นคุณจึงสามารถวางได้


ขอบคุณ codeaddict เครื่องหมายคำถามใช้แทน '+. * หรือไม่? + `?
จิม

เมื่อใช้ grep regex คุณจะได้รับข้อผิดพลาดหากคุณวาง {1} (grep: lookbehind การยืนยันไม่ได้มีความยาวตายตัว) ดังนั้นจึงเป็นกรณีที่ปล่อยไว้
Zunderscore

6

คุณต้องทำเครื่องหมายตัวอักษรเดียวเป็นตัวเลือกเช่นกัน:

([A-Z]{1})? +.*? +

หรือเลือกทั้งส่วนก็ได้

(([A-Z]{1}) +.*? +)?

1
สเตฟานฉันต้องการทำให้จดหมายเป็นทางเลือกโดยสิ้นเชิง ฉันลองทั้งสองอย่างนี้แล้ว แต่ก็ยังไม่ตรงกันอะไรเลย ฉันแน่ใจว่าฉันเข้าใจผิด คุณสามารถแก้ไขตัวอย่างเพื่อรวมไว้ในสตริงได้หรือไม่
จิม

0

นอกจากนี้คุณยังสามารถใช้ regex ง่ายออกแบบมาสำหรับกรณีของคุณเหมือน(.*)\/(([^\?\n\r])*)ที่$2ตรงกับสิ่งที่คุณต้องการ

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