โดยสรุปไม่มี Regex ของ Vim นั้นมีรสชาติที่เป็นเอกลักษณ์และไม่มีทางเลือกอื่นที่จะทำให้มันมีพฤติกรรมเหมือนกับรสชาติอื่น
ฉันคิดว่านี่เป็นสิ่งที่ดี
มายากล
'magic'
ตัวเลือกที่จะไม่เปลี่ยนรสชาติของ regex ที่ใช้เป็นกลุ่ม มันสลับพฤติกรรมของ\
อะตอมที่มีการหลีกเลี่ยงหลายอย่าง
ตัวอย่างเช่นโดยค่าเริ่มต้น+
คือตัวอักษรตาม+
ตัวอักษรโดยที่\+
หมายถึง "อะตอมหนึ่งตัวหรือมากกว่า" ในทางตรงกันข้าม*
หมายถึง "ศูนย์หรือมากกว่าของอะตอมก่อนหน้านี้" ในขณะที่เป็นตัวอักษร\*
*
หลายคนพบว่ามันค่อนข้างสับสน การใช้\v
รูปแบบของคุณทำให้มันสอดคล้องกันมากขึ้น :help 'magic'
ให้บทสรุปที่ดี:
after: \v \m \M \V matches ~
'magic' 'nomagic'
$ $ $ \$ matches end-of-line
. . \. \. matches any character
* * \* \* any number of the previous atom
() \(\) \(\) \(\) grouping into an atom
| \| \| \| separating alternatives
\a \a \a \a alphabetic character
\\ \\ \\ \\ literal backslash
\. \. . . literal dot
\{ { { { literal '{'
a a a a literal 'a'
ส่วนตัวผมคิดว่าการทำงานเริ่มต้นเป็นสิ่งที่ดีสำหรับไฟล์รหัสซึ่งก็ไม่ใช่เรื่องแปลกที่จะค้นหาสิ่งที่ต้องการโดยใช้อักษรfoo(
(
รสชาติ Regex ของ Vim
ฉันเคยเห็นหลายคนที่ต้องการให้ Vim รองรับ PCRE โดยส่วนตัวฉันต้องการเครื่องมืออื่น ๆ ที่สนับสนุนรสชาติของ regex ของ Vim มันมีความสามารถบางอย่างที่เป็นไปไม่ได้หรือยุ่งยากเกินไปที่จะประสบความสำเร็จใน PCRE
เป็นไปไม่ได้ใน PCRE
Lookaroundเป็นคุณสมบัติทั่วไปที่คุณสามารถยืนยันได้ว่ารูปแบบไม่ตรงกันหรือไม่ตรงกันก่อนหรือหลังรูปแบบที่คุณพยายามจับคู่ ตัวอย่างเช่นรูปแบบ PCRE q(?!u)
(หรือเป็นกลุ่มรูปแบบ regex qu\@!
) ตรงกับที่ไม่ได้ตามมาด้วยq
u
(สิ่งนี้ถูกต้องมากกว่าq[^u]
ซึ่งต้องใช้ว่ามีอักขระบางตัวอยู่หลังq
)
ลักษณะลบเชิงลบที่มีความยาวแปรผัน
PCRE และรสชาติอื่น ๆ มีข้อ จำกัด ว่ารูปแบบเชิงลบด้านหลังจะต้องมีความยาวคงที่ นั่นหมายความว่ารูปแบบเช่น(?<![a-z]{3})foo
ความหมาย "สตริงfoo
ไม่นำหน้าด้วยตรง 3 ตัวอักษรตัวพิมพ์เล็ก") เป็นดี แต่(?<![a-z]+)foo
(ความหมาย "สตริงfoo
ไม่นำหน้าด้วยหมายเลขใด ๆของตัวอักษรตัวพิมพ์เล็ก") ไม่ได้
ข้อ จำกัด นี้ไม่มีอยู่ในกลุ่ม ใน Vim รูปแบบเช่น\([a-z]\+\)\@<!foo
ในขณะที่อาจดูน่าเกลียดเล็กน้อยก็ใช้ได้จริง
ง่ายกว่าใน Vim regex
บางสิ่งมีจำนวนมากขึ้นในรสชาติของ regex ของ Vim
จุดเริ่มต้นและจุดสิ้นสุดของจุดยึดที่ตรงกัน
สิ่งที่โดดเด่นที่สุดในความคิดของฉันคือ\zs
และ\ze
เบรก สิ่งเหล่านี้ช่วยให้คุณสามารถระบุจุดเริ่มต้นและจุดสิ้นสุดของการแข่งขัน ยกตัวอย่างเช่นfoo(\zs.*\ze)
ที่ตรงกันเท่านั้นสิ่งที่อยู่ระหว่าง(
และในการเรียกใช้ฟังก์ชันเช่น)
foo(...)
สิ่งนี้สามารถทำได้ใน PCRE แต่ต้องใช้ lookaround ซึ่งน่าเบื่อเล็กน้อย:(?<=foo\().*(?=\))
การจับคู่คำนำหน้า
อีกสิ่งที่ยอดเยี่ยมที่ Vim สามารถทำได้คือจับคู่คำนำหน้าใด ๆ (รวมถึงส่วนนำหน้าว่าง) ของลำดับอักขระเฉพาะ ตัวอย่างเช่นการจับคู่f
, fo
, foo
หรือfood
รูปแบบf\%[ood]
สามารถนำมาใช้ ใน PCRE, f(o(od?)?)?
รูปแบบดังกล่าวจะมีลักษณะเหมือน (ลองจินตนาการดูว่าสตริงนั้นยาวกว่านี้!
การจับคู่ตำแหน่งเคอร์เซอร์บรรทัดและคอลัมน์
Regex ของ Vim มีจุดยึดสำหรับการจับคู่ตำแหน่งในบัฟเฟอร์
\%23c
ตรงกับคอลัมน์ 23
\%<23c
จับคู่ก่อนคอลัมน์ 23
\%>23c
จับคู่หลังจากคอลัมน์ 23
\%16l
ตรงกับบรรทัดที่ 16
- คล้ายกับคอลัมน์มีจุดยึดสำหรับก่อนหรือหลังหมายเลขบรรทัด
\%#
ตรงกับตำแหน่งเคอร์เซอร์
ฉันคิดว่ามันคุ้มค่าที่จะยอมรับรสชาติของ Regex ของ Vim มันเหมาะอย่างยิ่งสำหรับใช้ในโปรแกรมแก้ไขข้อความที่ใช้สำหรับการเขียนโปรแกรมเป็นหลัก
\v
มี<>
ขอบเขตของคำซึ่ง AFAIK นั้นไม่เหมือนใครใน Vim ดังนั้นไม่เพียงแค่อธิบายว่า "Vim regex" (ไม่โพสต์เป็นคำตอบเพราะฉันไม่ได้บวก)