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 的编辑答案现在对我有用!

4

1 回答 1

10

Java 的正则表达式库提供了这个功能:

String s = Pattern.quote(orig);

“引用”字符串将转义其所有元字符。首先,转义你的字符串,然后通过它并用替换数字\d来制作一个正则表达式。由于正则表达式库使用\Qand\E进行引用,因此您需要将您的正则表达式部分括在 and 的反引号\E\Q

我将在您的实现中更改的一件事是替换算法:我不会逐个字符地替换,而是替换成组的数字。Page 3 of 23这将允许从匹配字符串(如Page 13 of 23and )生成表达式Page 6 of 8

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

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

于 2013-04-16T10:18:53.663 回答