Lookbehind เชิงลบ / การยืนยันล่วงหน้าใน Linux เพจเจอร์น้อย (หรือเป็นกลุ่ม)


14

ฉันต้องการที่จะหาทุกกรณีของ "ดัชนี" ไม่ได้ตามมาด้วย .php lessในการเข้าสู่ระบบโดยใช้ /index(?!\.php)ไม่ทำงาน, ไม่เป็นผล. เป็นไปได้ไหม regex มีค่าน้อยกว่าและเป็นกลุ่ม (แตกต่างกันอย่างไร) สิ่งนี้เป็นไปไม่ได้ด้วยไลบรารี regex ของแอปพลิเคชันเหล่านี้หรือไม่


คำตอบ:


22

ในvimคุณสามารถทำสิ่งนี้:

/index\(\.php\)\@!

สำหรับรายละเอียดเพิ่มเติมในโหมดคำสั่งลอง:h \@:

\@!     Matches with zero width if the preceding atom does NOT match at the
        current position. /zero-width {not in Vi}
        Like '(?!pattern)" in Perl.
        Example                 matches
        foo\(bar\)\@!           any "foo" not followed by "bar"
        a.\{-}p\@!              "a", "ap", "aap", "app", etc. not immediately
                                followed by a "p"
        if \(\(then\)\@!.\)*$   "if " not followed by "then"

สวย! ความคิดใดสำหรับน้อย มันใช้งานไม่ได้ ฉันต้องการพฤติกรรม regex คือ PCRE ทุกหนทุกแห่ง แต่ก็ไม่ใช่
เกร็ก Leventhal

7
นอกจากนี้โปรดสังเกตไวยากรณ์สำหรับnegativ lookbehind :\@<!
lanoxx

มันไปด้วยการบอกว่าคุณต้องใส่ในเชิงลบก่อนรูปแบบด้านหลัง ตัวอย่าง: \(some\)\@<!thingจะตรงthingและeverythingและแต่ไม่nothing something
dwanderson

7

(?!\.php)เป็นผู้ประกอบการ regexp perl lessโดยทั่วไปจะใช้ POSIX regexp API ของระบบดังนั้นโดยทั่วไปแล้ว GNU จะขยายนิพจน์ทั่วไปบนระบบ GNU โดยvimใช้vimนิพจน์ทั่วไป

ในvimขณะที่แสดงให้เห็นแล้วโดย cuonglm เทียบเท่าของindex(?!\.php)จะเป็นหรือindex\(\.php\)\@!\vindex(\.php)@!

สำหรับlessที่รวบรวมเวลาคุณสามารถเลือก regex ห้องสมุด / API และเป็นผลชนิด regex กับการใช้งาน:

    --with-regex={auto,gnu,pcre,posix,regcmp,re_comp,
                    regcomp,regcomp-local,none}
        Select a regular expression library  auto

โดยค่าเริ่มต้นแม้ว่าlessจะใช้ POSIX regcompกับ REG_EXTENDED grep -Eดังนั้นคุณจะได้รับการแสดงออกปกติขยายของระบบของคุณจึงมักจะมีอะไรบางอย่างที่คล้ายกันเช่นเดียวกับ

ใน GNU ที่ขยายเพิ่ม regexp ไม่มีสิ่งใดเทียบเท่าหรือมองไปข้างหน้าผู้ประกอบการ

คุณสามารถทำได้อย่างหนัก:

index($|[^.]|\.($|([^p]|p($|([^h]|h($|[^p]))))))

ด้วยlessคุณอาจใช้&ปุ่มเพื่อกรองบรรทัดที่มีindex.php( &!index\.php) แล้วค้นหาindex( /index) (คุณยังคงพลาดอินสแตนซ์อื่น ๆ ของindexที่ปรากฏในบรรทัดด้วยindex.php)


1
ฉันคิดว่าสิ่งที่ห้องสมุด regex ซึ่งlessใช้ขึ้นอยู่กับเวลารวบรวม
cuonglm

@Gnouc คุณพูดถูกแม้ตอนนี้ก็รองรับ PCRE เหมือนกัน
Stéphane Chazelas

ใช่เราสามารถตรวจสอบlessการใช้งานโดยแยกการส่งออกของPCRE ldd $(which less)แต่มีห้องสมุดอื่นคุณรู้วิธีการตรวจสอบหรือไม่?
cuonglm

1
@Gnouc จะพิมพ์ชื่อของไลบรารี regex less --versionกับ
Stéphane Chazelas

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