天天看點

使用xr幫助分析Elisp正規表達式

原文位址:https://www.lujun9972.win/blog/2020/11/23/使用xr幫助分析elisp正規表達式/index.html

Elisp 的正規表達式文法以繁雜著稱,分析起來特别麻煩。今天發現一個

xr

庫非常好用,可以把Elisp正規表達式文法翻譯成

rx

的格式,友善我們對其進行分析。 例如我們嘗試使用

xr

org-heading-regexp

進行分析:

(xr org-heading-regexp)
      
(seq bol
     (group
      (one-or-more "*"))
     (opt
      (one-or-more " ")
      (group
       (*? nonl)))
     (zero-or-more
      (any "     "))
     eol)
      

從中可以很清楚的看到整個正規表達式分成5個部分:

  1. bol

    表示行首
  2. (group (one-or-more "*"))

    一個或多個星号組成的分組
  3. (opt (one-or-more " ") (group (*? nonl)))

    一個可選項,由一個或多個空格和任意多個非換行字元的分組(其中 *? 說明使用貪婪算法)組成。
  4. (zero-or-mode (any " "))

    任意多個制表符或空格
  5. eol

    表示行末

注意到,結果中有很多類似

bol

,

nonl

,

eol

這樣的縮寫,我們可以通過将第二個參數設定為

'verbose

來輸出詳細說明:

(xr org-heading-regexp 'verbose)
      
(seq line-start
     (group
      (one-or-more "*"))
     (zero-or-one
      (one-or-more " ")
      (group
       (*? not-newline)))
     (zero-or-more
      (any "     "))
     line-end)