[英]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 23
和Page 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.