Regex ใน Vi: มีวิธีใช้คลาสอักขระภายในกลุ่มได้อย่างไร (เช่น [\ s \ w])


15

ใน Vim คลาสอักขระจะ\sตรงกับอักขระช่องว่างใด ๆ เมื่อฉันใช้ตัวอักษรพิเศษผู้ที่อยู่ในกลุ่มเช่น[\s\w]มันไม่ตรงกับช่องว่างเดียวหรือตัวอักษรคำก็ไม่ตรงหรือsw

เราใช้คลาสตัวละครในกลุ่มได้อย่างไร


8
ซึ่งแตกต่างจากการใช้งานบางอย่างของเอ็นจิ้นนิพจน์ทั่วไป Vim's ดูเหมือนจะไม่สนับสนุนสัญกรณ์นั้น [[:space:][:alnum:]_]สามารถใช้เพื่อประมาณค่าคอลเลกชัน\sและ\wแม้ว่า
Peter Lewerin

@PeterLewerin กรุณาโพสต์ว่าเป็นคำตอบ
Christopher Bottoms

@ChristopherBottoms: เสร็จแล้ว
Peter Lewerin

คำตอบ:


11

นั่นไม่ใช่กลุ่มมันเป็นช่วงและใน Vim คุณไม่สามารถใช้คลาสอักขระได้ (แม้ว่าจะเป็นไปได้ในการใช้งาน regex อื่น ๆ เช่นในไพ ธ อน ) คุณจะต้องใช้ทางเลือกแทน:

/\(\w\|\s\)

หรือ:

/\v(\s|\w)

(หรือวิธีแก้ปัญหาที่เสนอโดยPeter Lewerin )


2
เพียงเพราะเราสามารถสร้างช่วงที่ไม่ถูกต้องในคลาสของตัวละครไม่ได้หมายความว่าไม่ควรใช้บางอย่าง\sในคลาสของตัวละคร การใช้ regex ของ Vim นั้นเกิดขึ้นเพื่อให้มีทางเลือก แต่การใช้งานอื่น ๆ ทำให้คุณสามารถใช้งาน[\s]ได้
jamessan

@VanLaser หากคุณแก้ไขคำตอบด้วยข้อมูลนี้ ([\ s] เป็นไปได้ในการใช้งาน regex อื่น ๆ แต่ไม่ใช่ในกลุ่ม) ฉันจะยอมรับคำตอบของคุณ!
จอห์น HK

(ถูกต้อง, ถูกเพิ่ม)
VanLaser

11

ต่างจากการใช้เอ็นจิ้นนิพจน์ทั่วไปบางอย่างดูเหมือนว่า Vim จะไม่สนับสนุนสัญกรณ์นั้น ( [\s\w]) ในคอลเล็กชัน หนึ่งสามารถใช้การแสดงออกของคลาสตัวละคร POSIXแม้ว่า

  • [:blank:]\sเป็นเช่นเดียวกับ
  • [:space:]ตรงกับจำนวนมากของตัวอักษรช่องว่างกว่าไม่และดูเหมือนว่าจะเทียบเท่ากับ\s\_s
  • [:alnum:]ประมาณ \wแต่ไม่ตรงกับขีดล่าง ( _)

ดังนั้นคอลเลกชันที่คุณต้องการอาจจะเขียนเป็นหรือ[[:blank:][:alnum:]_][[:space:][:alnum:]_]

ผมยังไม่ได้รับการตรวจสอบโดยการทดสอบนี้ แต่มันถูกบันทึกไว้ใน:h regexp, และ:h /character-classes:h /collection

หมายเหตุการพกพา: ในเอ็นจิน regex อื่น ๆ\sโดยทั่วไปจะเหมือนกับ[:space:](หรือ\_s) อยู่ในกลุ่ม

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