การจับคู่อักขระพิเศษด้วยนิพจน์ปกติ


10

พูดว่าง่ายมากถ้าฉันต้องการค้นหาบางอย่างที่มีตัวอักษรและตัวพิมพ์เล็ก

Produc_text | grep -E '[0-9a-z]'

วงเล็บมีประโยชน์ในการจับคู่ชุดอักขระ แต่สิ่งที่เกี่ยวกับสิ่งที่ค่อนข้างพิเศษ?
ถ้าผมต้องการที่จะใช้วงเล็บตรงกับใด ๆของตัวละครแต่อย่างใดอย่างหนึ่งต่อไปนี้: วงเล็บปิด]เส้นประ (หรือยัติภังค์) "-" ทั้งทับ/และ\, เครื่องหมาย^, :ลำไส้ใหญ่
มันจะเป็นแบบนี้ (ฉันรู้ว่ามันใช้ไม่ได้)?

[^] - / \ ^:]

คำตอบ:


11

ในการจับคู่ตัวอักษร]และตัวอักษร-ในวงเล็บนิพจน์คุณจะต้องใช้มันดังนี้:

[^]/\^:-]

หรือดียิ่งขึ้นเนื่องจากเครื่องมือบางอย่างต้องการแบ็กสแลชเพื่อหนี :

[^]/\\^:-]

นั่นคือ
right-square-bracket (']') จะสูญเสียความหมายพิเศษของมันและแสดงตัวเองในการแสดงออกวงเล็บถ้ามันเกิดขึ้นเป็นครั้งแรกในรายการ (หลังจากเริ่มต้น '^' ถ้ามี)
และ
อักขระยัติภังค์ลบ ให้ถือว่าเป็นตัวมันเองหากมันเกิดขึ้นก่อน (หลังจากเริ่มต้น '^', ถ้ามี) หรือสุดท้ายในรายการ
ดังนั้น
หากการแสดงออกวงเล็บระบุทั้ง '-' และ ']', ']' จะถูกวางไว้ก่อน (หลังจาก '^' ถ้ามี) และ '-' อยู่ภายในนิพจน์วงเล็บเหลี่ยม
กฎระเบียบสำหรับการแสดงออกวงเล็บจะเหมือนกันสำหรับEREและBRE


2
ฉันต้องการแบ็กสแลชสองเท่าเพื่อให้ปลอดภัย มันจำเป็นกับหลายawkการใช้งานและperlตัวอย่างเช่น
Stéphane Chazelas

สิ่งที่เกี่ยวกับ "จาก caret เพื่อปิดวงเล็บ"? ชอบ[^-]](อันนี้ล้มเหลว)?
iBug

2
@iBug - ตรวจสอบว่าล้มเหลวเนื่องจากวงเล็บขวาต้องเป็นอันดับแรกหากคุณต้องการจับคู่อย่างแท้จริง ผมไม่แน่ใจว่าฉันจะได้รับจุดที่ว่า "ช่วง" ที่คุณพูดถึงในฐานะ^เป็นหลัง]จึง[^-]]จะไม่ทำงานแม้ว่าทั้งสอง^และ]ได้รับการรักษาอย่างแท้จริง (เช่นเดียว[b-a]) อย่างไรก็ตามถ้าคุณต้องการที่จะตรงจากเช่น;การปิดวงเล็บคุณสามารถใช้ช่วงถึงถ่านก่อน](ซึ่งเป็นเครื่องหมายทับขวา) และรวมถึงเป็นครั้งแรกในถ่านแสดงออกวงเล็บเพื่อให้เช่น] [];-\\]
don_crissti

@don_crissti เกี่ยวกับ[[.^.]-[.-.]]อะไร ฉันมีความรู้สึกว่าสิ่งนี้จะได้ผล สมมติว่ารหัส ASCII ของก่อน^ -
iBug

เตรียมพร้อมแก้ปัญหาขี้เกียจสำหรับคำถามของฉัน รับทุกสิ่งที่พิเศษเพื่อเรียงตัวละครเช่น[^[.].][.-.]/\^:]
iBug

7

บางทีคุณอาจต้องมีตัวละครสองตัวในสถานที่เฉพาะ คุณต้องมี]อักขระตัวแรกในชุดและ-ต้องเป็นอักขระตัวสุดท้ายในชุด

นี่คือ RE ที่ตรงตามความต้องการของคุณ[^]\^/-]::

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4

1
มันไม่แปลกจริง ๆ มันแค่จำเป็นต้องหลีกเลี่ยงความคลุมเครือ
เควิน

1
[อักขระที่สองไม่ได้อยู่ที่นั่น OP ไม่ต้องการยกเว้น
Scott

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