標籤:

關於多正則匹配

在實際項目中,你可能有10萬個以上的正則, 要從文本中找出哪些正則命中了,命中的位置是什麼。比如,我大天朝必備的敏感詞過濾,就有這個需求。

我們一直用java,很明顯,用java 的 Pattern 類無法滿足需求。 你不能採取下述笨方法吧?

for( Pattern pat : allpats) {

Matcher m = pat.match(text);

while(m.find()){

//do something

}

}

那麼什麼方法比較好啊?

一般地, REGEXP 的現代實現內部都有一個 Automation, 不是 NFA 就是 DFA, 或者二者都有。 國內有一個叫雷宵鵬的,好像研究過這個問題。國外的,有一個開源項目,lightgrep,也是多正則匹配的。

我在github 上放了一個項目 zhouzusheng/multiregexp, 就是對lightgrep 的一個java 封裝。

lightgrep 內部,也是用NFA 構造的,最後也轉換成了 DFA,所以能高效實現匹配。

但是,所有用DFA的,都有一個缺點,無法實現正則的分組捕獲, 這也是一個遺憾吧。

當然,適當犧牲性能,匹配到後再次計算一下,是可以實現分組的。這裡不考慮。

簡單廣告一下,我的包裝的功能

  1. 同時支持單模式與多模式
  2. 支持一次編譯,多次使用,其中使用過程可以在另外的線程中
  3. 支持編譯後序列化為位元組數組,進而可以序列化到文件。當然也支持序列化載入
  4. 匹配支持字元串或者位元組數組
  5. 匹配位置自動轉換為按字元計數而不是原始的位元組計數
  6. 支持相當廣泛的unicode 屬性名稱匹配

推薦閱讀:

Go語言中使用正則提取匹配的字元串
正則表達式及其簡單應用-前端筆記
【轉載】Python正則表達式指南

TAG:正則表達式 |