簡體   English   中英

從字符串生成正則表達式

[英]generating a regular expression from a string

我希望從包含數字的字符串生成正則表達式,然后將其用作模式來搜索類似的字符串。 例:

String s = "Page 3 of 23"

如果我用\\d替換所有數字

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
    char c = s.charAt(i);
    if (Character.isDigit(c)) {
        sb.append("\\d"); // backslash d
    } else {
        sb.append(c);
        }
    }

    Pattern numberPattern = Pattern.compile(sb.toString());

//    Pattern numberPattern = Pattern.compile("Page \d of \d\d");

我可以用它來匹配類似的字符串(例如"Page 7 of 47" )。 我的問題是,如果我天真地這樣做,一些元字符,如(){}-等將不會被轉義。 是否有一個庫可以執行此操作,或者是正則表達式的詳盡字符集,我必須且不能逃避? (我可以嘗試從Javadocs中提取它們,但我擔心會遺漏一些東西)。

或者有一個已經這樣做的庫(我現在不想使用完整的自然語言處理解決方案)。

注意:@ dasblinkenlight編輯的答案現在適合我!

Java的regexp庫提供了這個功能:

String s = Pattern.quote(orig);

“引用”字符串將使其所有元字符都被轉義。 首先,轉義你的字符串,然后遍歷它並用\\d替換數字來制作正則表達式。 由於正則表達式庫使用\\Q\\E進行引用,因此需要將正則表達式的部分用\\E\\Q反引號括起來。

我將在實現中改變的一件事是替換算法:我會替換組中的數字,而不是逐字符替換。 這將使得從Page 3 of 23 Page 13 of 23Page 6 of 8 Page 13 of 23 Page 6 of 8生成的表達式匹配。

String p = Pattern.quote(orig).replaceAll("\\d+", "\\\\E\\\\d+\\\\Q");

無論最初的頁碼和計數是什么,這都會產生 "\\QPage \\E\\d+\\Q of \\E\\d+\\Q\\E" 輸出在\\d只需要一個而不是兩個斜杠,因為結果直接送到regex引擎,繞過Java編譯器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM