regex จะจับคู่อะไรกับตัวละครทุกตัวยกเว้นคอมม่า ',' หรือเซมิโคลอน ';'?


345

เป็นไปได้หรือไม่ที่จะกำหนด regex ที่จะจับคู่กับตัวละครทุกตัวยกเว้นตัวละครที่กำหนดไว้หรือชุดของตัวละคร?

โดยทั่วไปฉันต้องการแยกสตริงด้วยเครื่องหมายจุลภาค (,) หรือเซมิโคลอน (;) ดังนั้นฉันจึงคิดที่จะทำมันด้วย regex ซึ่งจะจับคู่ทุกอย่างจนกว่าจะพบเครื่องหมายจุลภาคหรือกึ่งลำไส้ใหญ่

คำตอบ:


474
[^,;]+         

คุณยังไม่ได้ระบุการใช้งาน regex ที่คุณใช้ ส่วนใหญ่มีSplitวิธีการที่ใช้ตัวคั่นและแยกโดยพวกเขา คุณอาจต้องการใช้อันนั้นกับ^คลาสอักขระ"ปกติ" (ไม่มี):

[,;]+

10
และคำถามไม่ได้ระบุว่าอนุญาตให้ใช้ตัวคั่นที่อยู่ติดกันได้ดังนั้นการต่อท้าย '+' ค่อนข้างน่าสงสัยเล็กน้อย
Jonathan Leffler

รับข้อผิดพลาดสำหรับเซมิโคลอนเท่านั้น - regexp ที่ไม่ถูกทำลายตรงตามจุดสิ้นสุดของไฟล์
Jaswinder

ฉันมีข้อกำหนดที่คล้ายกันซึ่งฉันต้องการหลีกเลี่ยงเครื่องหมายอัฒภาคและเครื่องหมายจุลภาคในตอนท้ายฉันพยายามมาก แต่ไม่ประสบความสำเร็จด้านล่างคือ Regex ฉันใช้ const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-Z0-9 -] {0,61} [A-Za-Z0-9]) \) + [A-Za-Z0-9] [A-Za-Z0-9 -]. { 0,61} [A-Za-Z0-9] / g; ตรวจสอบได้ดีถ้าฉันใช้และ; ในระหว่าง แต่ล้มเหลวในตอนท้ายเพื่อ vliadate
Harry

87

ใช้คลาสตัวละคร คลาสตัวละครที่ขึ้นต้นด้วยคาเร็ตจะตรงกับสิ่งที่ไม่ได้อยู่ในคลาส

[^,;]


ฉันมีข้อกำหนดที่คล้ายกันซึ่งฉันต้องการหลีกเลี่ยงเครื่องหมายอัฒภาคและเครื่องหมายจุลภาคในตอนท้ายฉันพยายามมาก แต่ไม่ประสบความสำเร็จด้านล่างคือ Regex ฉันใช้ const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-Z0-9 -] {0,61} [A-Za-Z0-9]) \) + [A-Za-Z0-9] [A-Za-Z0-9 -]. { 0,61} [A-Za-Z0-9] / g; ตรวจสอบได้ดีถ้าฉันใช้และ; ในระหว่าง แต่ล้มเหลวในตอนท้ายเพื่อ vliadate
Harry


2

ใช้สิ่งนี้:

([^,;]*[,;])*

5
ที่ต้องใช้เครื่องหมายจุลภาคหรือเซมิโคลอนเป็นตัวคั่นฟิลด์แทนที่จะเป็นตัวคั่นฟิลด์ ความแตกต่างสำคัญในตอนท้ายของ 'บรรทัด' (หรือโครงสร้างบันทึกที่สแกนอื่น ๆ ) โดยทั่วไปแล้วคุณไม่ต้องการยืนยันเครื่องหมายจุลภาคหรือเซมิโคลอนหลังฟิลด์สุดท้าย หากเอนจิน regex ของคุณมีพลังมากพอคุณสามารถใช้ ' (?:([^,;]*)(?:[^,;]|$))' (PCRE พร้อมกับวงเล็บที่ไม่ได้ถ่ายภาพ) ตัวเลือกของเครื่องหมายจุลภาคหรือเซมิโคลอนหลังฟิลด์หรือจุดสิ้นสุดของเรกคอร์ดทำให้สิ่งต่าง ๆ ทำงานได้ดีขึ้น รวมทั้งพิจารณาว่าอนุญาตให้มีฟิลด์ว่างหรือไม่
Jonathan Leffler

1
ในที่สุดคุณต้องกังวลเกี่ยวกับสิ่งที่ถูกส่งคืนจริง ๆ จากการถูกจับ - คุณต้องการตัวคั่นรวมอยู่หรือไม่และถ้ามี 10 ฟิลด์ในหนึ่งบรรทัดจะมีจำนวนของการคืนค่าเหล่านี้โดยสัญกรณ์การจับภาพ
Jonathan Leffler

1
คุณถูกต้องเกี่ยวกับสิ่งนั้น แต่เหตุผลที่ฉันไม่เห็นด้วยกับสิ่งเหล่านั้นในคำตอบของฉันคือฉันไม่รู้ว่าภาษา / ห้องสมุดของ RegEx ที่ผู้ถามถาม เขาอาจใช้ "GREP" อย่างไรก็ตามฉันขอขอบคุณที่คุณเพิ่มความคิดเห็นเหล่านั้นเพื่อล้างสิ่งต่าง ๆ สำหรับเขา : D
NawaMan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.