从字符串生成正则表达式

pet*_*ust 10 java regex

我希望从包含数字的字符串生成正则表达式,然后将其用作模式来搜索类似的字符串.例:

String s = "Page 3 of 23"
Run Code Online (Sandbox Code Playgroud)

如果我替换所有数字 \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");
Run Code Online (Sandbox Code Playgroud)

我可以用它来匹配类似的字符串(例如"Page 7 of 47").我的问题是,如果我天真地这样做(){}-,一些元字符,如等,将不会被转义.是否有一个库可以执行此操作,或者是正则表达式的详尽字符集,我必须且不能逃避?(我可以尝试从Javadocs中提取它们,但我担心会遗漏一些东西).

或者有一个已经这样做的库(我现在不想使用完整的自然语言处理解决方案).

注意:@ dasblinkenlight编辑的答案现在适合我!

das*_*ght 10

Java的regexp库提供了这个功能:

String s = Pattern.quote(orig);
Run Code Online (Sandbox Code Playgroud)

"引用"字符串将使其所有元字符都被转义.首先,转义你的字符串,然后通过它并替换数字\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");
Run Code Online (Sandbox Code Playgroud)

无论最初的页码和计数是什么,这都会产生 "\QPage \E\d+\Q of \E\d+\Q\E".输出只需要一个,而不是两个斜杠\d,因为结果直接送到regex引擎,绕过Java编译器.