Elisp'in normal ifadeleri var mı?


14

Normal ifadelerimin gerektirdiği ters eğik çizgi sayısı oldukça çılgın. Elip'in normal ifadeleri var mı, bu yüzden şöyle bir şey yazabilirim

rx"some\(regexp\)"

onun yerine

"some\\(regexp\\)"

Emacs gibi bazı regexp'in yapıları vurgular \\|, \\(ve \\). Ne yazık ki, birçok temada bu görünmez. Bunu geçersiz kılabilir font-lock-regexp-grouping-backslashve font-lock-regexp-grouping-constructdaha belirgin hale getirebilirsiniz.
Lindydancer

2
Ham dize değişmezlerini desteklemek için bir yama yaptım ama geliştiriciler ilgilenmiyor.
knarf

1
@ Abo-abo tarafından yazılan bu blog gönderisinde olduğu gibi, her zaman nasıl görüntülendiğini değiştirebilirsiniz: oremacs.com/2015/01/11/pretty-elisp-regex
glucas

@knarf, Stefan'ın ham dize desteğiyle ilgilenmemesi utanç verici çünkü ham dizeler yeni bir regexp sözdizimi için bir tamamlayıcı olacaktı, bu benim lehime değil.
nosefrog

Yanıtlar:


13

Seçeneklerden biri, rxsexps kullanarak ifadelerinizi oluşturmak için makroyu kullanmaktır.

Örneğin, (rx "some" (group "regexp"))

Nasıl rxçalıştığına dair bir fikir edinmek için rx.el'deki yorum bölümünden birkaç örnek daha :

Bu ^;;\\s-*\n\\|^\n olur

(rx (or (and line-start ";;" (0+ space) ?\n)
        (and line-start ?\n)))

Bu [ \t\n]*:\\([^:]+\\|$\\) olur

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))

2
@Knarf düzenlemesi için teşekkürler! Telefonumdaydım ve yanlış yapabileceğime dair bir örnek vermek istemedim. :-)
glucas

Aslında rxsözdizimi nedeniyle birçok regex araması ve yerine perl'den elisp kullanan birçok komut dosyasını taşıma sürecindeyiz , bu da onların bakımını kolaylaştırıyor. Imho, benzer durumlar için, rx sözdizimi tek başına elisp'i perl python, ruby, vb. İçin iyi bir ikame yapar.
gsl

7

Hayır regexp değişmez değerleri yoktur, ancak birçoğu pcre2el'i yararlı bir alternatif olarak bulur .

Özellikle elisp'den böyle kullanmak:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"

Bu hala ters eğik çizgilerinizi ikiye katlamanızı gerektirir. Ortalama regexp için çok fazla ihtiyacınız yok.
cjm
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.