dukungan untuk regex melihat ke belakang dan ke depan?

12

Saya perlu melakukan penggantian permintaan regex, sedemikian rupa

foodi foo bardicocokkan, tetapi foodi foo baztidak. Biasanya saya akan menggunakan regex melihat ke depan, mis foo(?=bar).

Namun, sepertinya Emacs tidak bisa melakukan ini? Vim tampaknya mampu , tetapi mode jahat di spacemac tidak bisa.

Heisenberg
sumber
Ada juga ini: github.com/gamesun/emacs-regex-lookaround , tapi saya tidak mencoba membangun dengan tambalan ini, dan sepertinya sudah lama.
wvxvw

Jawaban:

10

Tidak, ekspresi reguler Emacs tidak mendukung pernyataan nol-lebar melihat-depan / belakang sewenang-wenang.

nb Evil dan Spacemacs (seperti semua pustaka elisp) tidak relevan ketika menyangkut pertanyaan tentang implementasi bahasa Emacs Lisp.

phils
sumber
Jadi tidak mungkin untuk menggantikan foodi foobartetapi tidak dalam foobaz? Ini adalah operasi yang cukup umum yang saya pikir pasti ada solusinya. Mungkin melihat ke depan dan ke belakang adalah pendekatan yang salah?
Heisenberg
Ini tidak sepenuhnya setara, tetapi mengganti foo\(bar\)dengan baz\1akan cukup dalam semua kasus di mana bartidak mengandung kecocokan lebih lanjut.
phils
Jika Anda menulis elisp, Anda memiliki banyak fleksibilitas, dan jika Anda mengganti secara interaktif Anda dapat memanggil elisp sewenang-wenang selama penggantian, jadi pada akhirnya ada cara untuk melakukan hal-hal ini. Tidak semudah yang Anda lakukan dengan pernyataan itu.
phils
misalnya: mengganti foodengan \,(if (looking-at "bar") "baz" \&)akan diganti foodengan bazjika teks berikut ini bar(dan ganti foodengan yang foolain). Yang masih tidak sama dengan hanya mencocokkan foo ketika diikuti oleh bar, tetapi itu pilihan lain.
phils
Saya kira ini seperti apa yang Anda katakan di atas, tetapi sepertinya Anda dapat mengetik: CSM-% foo \ (bar \) RET FOO \ 1 RET untuk mengganti semua foo bar dengan bar FOO, tetapi biarkan semua foo baz sendirian. Apakah ini melewatkan beberapa hal yang Anda inginkan?
John Kitchin