สับสนเกี่ยวกับขอบเขตของคำ


13

ฉันค้นคว้ามามาก แต่ฉันยังไม่ชัดเจน อะไรคำว่าเขตแดนเฉลี่ย? มันทำอะไร?

ตัวอย่างเช่นมีคนอธิบายคำสั่งนี้ให้ฉันหน่อยได้ไหม

egrep '\b[A-Z]+\b' filename.sh

1
A "คำว่าเขตแดน" เป็นสิ่งที่เครื่องมือที่ใช้กำหนดเช่นนี้ ... บางคนคิดว่า nospace / พื้นที่หรือพื้นที่ / nospace ขอบเขตของคำที่คนอื่นคิดว่าเป็น "คำว่า" [azA-Z0-9_]เป็นประกอบด้วย ตรวจสอบคู่มือสำหรับegrep(1)บางทีการแก้ไขสำหรับนิพจน์ปกติที่ใช้งานอยู่
vonbrand

คำตอบ:


12

ตามที่อธิบายไว้ที่นี่ยกตัวอย่างเช่นมันตรงระหว่างคำ:

มีสามตำแหน่งที่แตกต่างกันซึ่งมีคุณสมบัติเป็นขอบเขตของคำ:

  1. ก่อนอักขระตัวแรกในสตริงถ้าอักขระตัวแรกเป็นตัวอักษรคำ
  2. หลังจากอักขระตัวสุดท้ายในสตริงถ้าอักขระตัวสุดท้ายเป็นตัวอักษรคำ
  3. ระหว่างอักขระสองตัวในสตริงโดยที่หนึ่งคืออักขระคำและอีกตัวหนึ่งไม่ใช่อักขระคำ

นี่คือตัวอย่างของแต่ละกรณี:

  1. สำหรับสตริงfoobarกรณีแรกจะจับคู่

     foobar
    ^-----here
    
  2. สำหรับสตริงfoobarตัวพิมพ์ที่สองจะจับคู่

    foobar
          ^--here
    
  3. สำหรับสตริงfoo barกรณีที่สามจะจับคู่

    foo bar
       ^--here, because space is not a word character
    

สิ่งที่มีคุณสมบัติเป็นตัวอักษรคำขึ้นอยู่กับการใช้งานการแสดงออกปกติเฉพาะ อย่างไรก็ตามในทุกกรณีตัวอักษร ( [a-z]และ[A-Z]), ตัวเลข ( [0-9]) และ_ถือเป็นตัวอักษรคำ


ดังนั้นตัวอย่าง regex ที่คุณโพสต์ ( \b[A-Z]+\b) หมายถึงค้นหาสตริงที่ยาวที่สุดที่อยู่ระหว่างสองคำและที่ประกอบด้วยตัวอักษรตัวพิมพ์ใหญ่เท่านั้น มันอาจจะง่ายต่อการอธิบายโดยตัวอย่าง:

echo "FOOBAR" | egrep '\b[A-Z]+\b'   # Works
echo "FOO BAR" | egrep '\b[A-Z]+\b'  # Works
echo "aFOOBARb" | egrep '\b[A-Z]+\b' # Does not work, we want capitals only
echo "12345" | egrep '\b[A-Za]+\b'   # Does not work, no letters
echo "1FOOBAR2" | egrep '\b[A-Z]+\b' # Does not work, 1 and 2 are word chars
echo "_FOOBAR_" | egrep '\b[A-Z]+\b' # Does not work, _ is a word char
echo "#FOOBAR$" | egrep '\b[A-Z]+\b' # Works, # and $ are not word chars

คำอธิบายที่ดีเยี่ยมเพียงทราบว่า Solaris ' egrep(หรือ/usr/xpg4/bin/egrep) ไม่ปฏิบัติ\bเช่นนี้ ตัวอย่างเช่นecho "FOOBAR" | egrep '\b[A-Z]+\b'จะไม่ตรงกัน
ปีเตอร์

0
egrep '\b[A-Z]+\b' filename.sh

ให้ทำลายมันได้:

  1. [A-Z]แสดงให้เห็นถึงตัวละครตัวหนึ่งใด ๆ [ABCDEFGHIJKLMNOPQRSTUVWXYZ]ในชั้นเรียนของตัวละคร
  2. [A-Z]+หมายถึงการเกิดขึ้นหนึ่งหรือมากกว่าของตัวอักษรตัวพิมพ์ใหญ่ ตรงกับตัวอย่างจะเป็น: A, HELLO, IS, I, ELEPHANTฯลฯ
  3. '\bINDIA\b': เป็นเหมือนคำทั้งค้นหาคำINDIAในกรณีบน มันจะไม่INDIANAตรงกับ ดังนั้นการใช้หลักการเดียวกัน - '\b[A-Z]+\b'จะมองหาคำทั้งหมดที่มีตัวอักษรหนึ่งตัวหรือมากกว่าในกรณีบน
  4. ดังนั้นegrep '\b[A-Z]+\b' filename.shจะค้นหาคำที่มีหนึ่งหรือมากกว่าตัวอักษรทั้งหมดในกรณีบนในแฟ้ม filename.sh-

\b - เหมือนกับการค้นหาคำทั้งหมด

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