Neden regex oluşturucu ile oluşturulan normal ifadeler etkileşimli normal ifadelerden farklı sözdizimi kullanıyor?


26

Bu nedenle, normal ifade oluşturucusunu (Mx yeniden oluşturucu) kullanarak, \ "ile biten satırları bulmak, arama yapmak ve regex ile değiştirmek, sadece" \ $ "alır. Regex kurucusunun doğrudan kullanılabilir ifadeler oluşturmasını beklerdim, bu yüzden bu fark ne?


6
Doğrudan kodda kullanılabilir ifadeler oluşturur.
abo-abo

1
@ abo-abo Aradığım cevap buydu, kodda kullanılabilir olan ile kullanıcı arayüzünde bulunanlar arasında bir fark olduğunu fark etmemiştim. Yeniden oluşturucunun kod sözdizimini kullandığı ve el kitabının söylemediği ancak sezgisel görünüyor, ancak bu farkı açıklıyor.
user2699

2
Regex oluşturucuyu etkileşimli aramalar oluşturmak için daha kullanışlı hale getirmek için ReBuilder emacs wiki sayfasına , özellikle reb-query-replaceişlev tanımına bakın.
dfeich

Yanıtlar:


29

Aslında dört farklı re-buildersözdizimi seçeneği var ve aralarında geçiş yapabilirsiniz.C-cTAB

Bunlardan ikisi sexp formlu regexp derleyicileri içindir rxve sregex(eski eskisi daha kapsamlı ve neredeyse tamamen sözdizimi uyumlu olduğundan, kullanılan eski kodla çalışmadığınız sürece sregex'i gerçekten görmezden gelebilirsiniz).

Diğer iki sözdizimi seçeneği read(varsayılan) ve string(etkileşimli olarak kullandığınız sözdizimidir).

readSözdizimi 'kod' sözdizimi - yani lisp okuyucu tarafından tanınan olarak - Eğer uyarınca Regexp'i girmek ettiği dizeleri okuma sözdizimi :

C-hig (elisp) Syntax for Strings RET

string(Ben her zaman bu bağlamda gereksiz kafa karıştırıcı adı kabul ettik) sözdizimi Normal ifade dize sözdizimi zaten okundu zaman gerektirdiği çıkış ve hangi nedenle karakterin herhangi yoktur yazma dize. Söylemek istediğim, bu gerçek düzenli ifade sözdizimidir, Emacs etkileşimli olarak sorulduğunda kullandığınız gibi.

Dize sözdizimini varsayılan olarak kullanmak istiyorsanız, init dosyanıza aşağıdakileri ekleyin veya kullanın. M-x customize-option RET reb-re-syntax RET

(setq reb-re-syntax 'string)

Regexp düzenlerken veri kaybı olmadan okuma ve dize sözdizimi arasında geçiş yapabileceğinizi unutmayın. Ayrıca geçiş yapabilirsiniz dan (; dizeleri sexps derleme olan kütüphaneler için ne olduğunu doğal olarak), ancak diğer yönde gidip bir dizesinden bir sexp üretemez / dize sözdizimi okumak için sexp formları. re-oluşturucu sexp'in ne olduğunu hatırlar, böylece sentaksı değiştirdiğinde bu formu kaybetmezsin ; ancak regexp'i farklı bir sözdiziminde değiştirir ve sonra geri dönerseniz güncellenmez. Kısacası, regexp'i bir sexp olarak oluşturuyorsanız, yalnızca bu sözdizimini kullanırken düzenlemeyi yaptığınızdan emin olun .


A yakaladım rxdesteği aslında kullanıyor olmasıdır rx-to-stringkullanarak oldukça özdeş değildir işlevini rxkodunda makro. rxisteğe bağlı sayıda form argümanını kabul eder ve bunları zımni bir sıra olarak rx-to-stringkabul eder , oysa yalnızca tek bir formu kabul eder ve herhangi bir üst düzey sıra açıkça '(sequence ...)veya eşdeğeri ile yapılmalıdır .

Bir formu girdiğinizde Kısacası, '(...)yeniden oluşturucu, o kadar işlenir (rx-to-string '(...))ve(rx ...)

Ayrıca, geçersiz bir formun re-builder, form yeniden geçerli hale getirildikten sonra bile, ilişkili arabellekteki eşleşmeleri dinamik olarak güncellemenin durmasına neden olabileceğini unutmayın . İçin C-cC-ubağlayıcı reb-force-update, bu durumları çözmek için kullanışlıdır.


Varsayılan olarak mod hat gösterileri "RE Oluşturucu" seçeneğini kullanarak readveya stringsözdizimi ve "RE Oluşturucu Lisp" seçeneğini kullanarak rxveya sregexsözdizimi, ama çok daha kullanışlı tanımlamak gibi görünüyor belirli kullanımda sözdizimi (özellikle ayırt etmek readve string).

delightPaketi GNU ELPA'dan yüklerseniz , mod satırına bir sözdizimi göstergesi eklemek için aşağıdakileri kullanabilirsiniz.

(let ((name '("Regexp[" (:eval (symbol-name reb-re-syntax)) "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))

Bu, mod adını readsözdiziminde "Regexp [read]" olarak değiştirir ve benzer şekilde diğerleri için de geçerlidir.

Veya yukarıda açıklanan rxvs rx-to-stringgetcha için bir ipucu eklemek için , rxsözdizimini kullanırken mod satırının "Regexp [rx-to-string]" deyin :

(let ((name '("Regexp["
              (:eval (symbol-name (if (eq reb-re-syntax 'rx)
                                      'rx-to-string
                                    reb-re-syntax)))
              "]")))
  (delight `((reb-mode ,name :major)
             (reb-lisp-mode ,name :major))))
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.