รองรับ lookaround regex ที่ไหนและไม่ได้อยู่ที่ไหน

ฉันพยายามพัฒนาทักษะ regex ของฉัน ฉันต้องการเรียนรู้เกี่ยวกับนิพจน์ lookahead และ lookbehind บนระบบ Archlinux ของฉันฉันลองสิ่งต่อไปนี้:

a=ab;if [[ $a =~ [a-z](?=b) ]]; then echo "Y";else echo "N";fi

ซึ่งเท่าที่ฉันเข้าใจ มันควรจะตรงกันและสะท้อนเสียง "Y" แต่ก็ไม่เป็นเช่นนั้น

echo ab |sed 's/[a-z](?=b)/x/'

...ก็ดูเหมือนจะไม่เข้ากันเช่นกัน grep ดูเหมือนจะไม่มองไปรอบๆ เช่นกัน แต่ pcregrep ทำ ฉันยังลองพยายามหลายครั้งในการอ้างอิงและ/หรือหนีสำนวน แต่ก็ไม่มีประโยชน์

ตอนนี้ฉันสับสนเล็กน้อย ใครช่วยกรุณาอธิบายให้ชัดเจนหน่อยว่า lookaround ซึ่งดูเหมือนจะไม่ ที่ แปลกใหม่เมื่อพิจารณาจากจำนวนการกล่าวถึงในบทช่วยสอนสามารถนำมาใช้ได้จริงหรือไม่ หรือฉันแค่สับสนกับการหลบหนีการแสดงออกของฉัน?


person some-non-descript-user    schedule 27.12.2015    source แหล่งที่มา
comment
ฉันอยากจะแนะนำ Mastering Regular Expressions โดย Jeffrey E.F. Friedl; มันเป็นข้อมูลอ้างอิง regex พื้นฐานของฉัน ฉันยังใช้ (regular-expressions.info) และ (reexegg.com) เป็นข้อมูลอ้างอิงออนไลน์ และ (regex101.com) หรือ (regexr.com) เป็นผู้ทดสอบสดสำหรับการทดลอง พวกเขาอาจเป็นประโยชน์กับคุณ   -  person rivy    schedule 28.12.2015


คำตอบ (2)


การยืนยัน Lookaround ไม่ได้รับการสนับสนุนโดยนิพจน์ทั่วไป posix พื้นฐานหรือแบบขยายซึ่งมีอยู่ใน bash หรือ sed

เครื่องมือที่ดีในการทดสอบคือ GNU grep ซึ่งรองรับตัวเลือก -P สำหรับนิพจน์ทั่วไป เข้ากันได้กับ Perl แบบนี้:

grep --color=auto -P '[a-z](?=b)' <<< 'ab'

แหล่งข้อมูลเพิ่มเติมก็คือเครื่องมือทดสอบ regex ออนไลน์ เช่น https://regex101.com/

person hek2mgl    schedule 27.12.2015
comment
โดยพื้นฐานแล้ว lookaround นั้นเป็นฟีเจอร์ Perl-Regex มากกว่าใช่ไหม - person some-non-descript-user; 27.12.2015
comment
@ some-non-descript-user ถูกต้องมากกว่าที่จะบอกว่า Perl รองรับการค้นหา - person Maroun; 27.12.2015
comment
@ some-non-descript-user นอกจากนี้ยังมีเอ็นจิ้น regex อื่น ๆ ที่รองรับการค้นหาเช่น Java, .NET, python เป็นต้น อย่างไรก็ตาม POSIX นิพจน์ทั่วไปไม่รองรับการค้นหา - person hek2mgl; 27.12.2015

คุณควรแยกแยะระหว่างนิพจน์ทั่วไป พื้นฐาน และ ขยาย

ในนิพจน์ทั่วไปพื้นฐาน อักขระเมตา ?, +, {, |, ( และ ) สูญเสีย ความหมายพิเศษ พวกเขาจำเป็นต้องหลบหนีเพื่อให้ได้ความหมายของ "regex"

ในทางกลับกัน ในนิพจน์ทั่วไป ขยาย อักขระเหล่านี้จะได้รับความหมาย "regex"

หากคุณ grep --help คุณจะได้รับ:

-E, --extended-regexp PATTERN คือ นิพจน์ทั่วไปแบบขยาย (ERE)

โปรดทราบว่า grep ไม่ รองรับการมองไปรอบๆ แต่รองรับใน pcregrep

person Maroun    schedule 27.12.2015
comment
ขอขอบคุณที่รับทราบเกี่ยวกับ regex ที่ขยายเพิ่ม - person some-non-descript-user; 27.12.2015