2013-04-16 149 views
10

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

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的編輯答案現在適用於我!

+0

下面是對哪些字符問題的回答,我不知道任何庫可以生成正則表達式:http://stackoverflow.com/questions/399078/what-special-characters-must-be-escaped-in -regular-expressions –

+0

@Evan謝謝。我只對Java感興趣,因此看起來像一個有用的資源。 –

回答

10

Java的正則表達式庫提供此功能:

String s = Pattern.quote(orig); 

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

我會改變你的實現中的一件事是替換算法:而不是逐個字符替換,我會替換組中的數字。這可以讓從Page 3 of 23產生的表達式匹配字符串,如Page 13 of 23Page 6 of 8

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

produce"\QPage \E\d+\Q of \E\d+\Q\E"無論什麼頁碼和計數在那裏原本。輸出只需要一個,而不是\d中的兩個斜線,因爲結果直接饋送到正則表達式引擎,繞過Java編譯器。

+0

很酷,我不知道這個方法。 – toniedzwiedz

+0

@dasblinkenlight太好了!同意我可能會尋找重複的數字,但也有啓發式值具有精確的數字計數。我可以使用這兩種方法。 –

+0

@ peter.murray.rust查看最後一次編輯:在輸出中製作兩個斜線所需的斜槓數量非常荒謬 - 編譯器時間爲2,正則表達式庫時間爲2,總共8個斜槓。 – dasblinkenlight