rulex:Rust一種新的正規表示式語言

banq發表於2022-03-12

普通的正則函式是非常簡潔的,但當它們變長時,它們就變得越來越難理解。
預設情況下,它們沒有註釋,而空白是重要的。
然後是大量的符號和反斜槓轉義,不遵循任何可識別的系統。(?<=) (?P<>) .?? \N \p{} \k<> \g'' 等等。
而且,在不同的regex實現之間存在各種不一致,這是造成混亂的完美秘訣。

Rulex用一種新的、更簡單的語法解決了這些問題。
  • 它對空格不敏感,並允許註釋
  • 文字必須出現在引號中。這使得表示式更長,但也更容易閱讀。
  • 沒有反斜槓轉義
  • 非捕獲組是預設的
  • 語法更一致


Rulex目前與PCRE、JavaScript、Java、.NET、Python、Ruby和Rust相容。在編譯過程中,必須要指定搜尋結果,所以rulex可以確保產生的搜尋結果在目標搜尋結果引擎上能正常工作。

對JavaScript使用者的重要提示。不要忘記啟用u標誌。這是支援Unicode的必要條件。所有其他主要的 regex 引擎預設都支援 Unicode。

案例:

# String
'hello world'                 # hello world

# Lazy repetition
'hello'{1,5}                  # (?:hello){1,5}?
'hello'*                      # (?:hello)*?
'hello'+                      # (?:hello)+?

# Greedy repetition
'hello'{1,5} greedy           # (?:hello){1,5}
'hello'* greedy               # (?:hello)*
'hello'+ greedy               # (?:hello)+

# Alternation
'hello' | 'world'             # hello|world

# Character classes
<p class="indent">['aeiou']                     # [aeiou]
<p class="indent">['p'-'s']                     # [p-s]


 
它不受任何正規表示式庫的支援。您只需指定正規表示式風格(例如Rust,如果您使用的是 Rust 正規表示式箱),它會輸出一個正規表示式,然後您可以將其傳遞給任何正規表示式引擎:

let my_regex = regex::Regex::new(
    rulex::Rulex::compile(
        r#"['tT'] 'est' '!'+"#,
        rulex::options::CompileOptions {
            flavor: rulex::options::RegexFlavor::Rust,
            ..Default::default()
        },
    ).unwrap(),
).unwrap();


但是如果在編譯時知道正規表示式,推薦使用 rulex-macro crate,它更方便,不新增執行時依賴,甚至在編譯時顯示診斷:

let my_regex = regex::Regex::new(
    rulex!(r#"['tT'] 'est' '!'+"#),
)
.unwrap();


 

相關文章