从字符串生成正则表达式

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


这里有一个回答“哪些字符必须在正则表达式中转义”的问题,但我不知道是否有任何库可以生成正则表达式:https://dev59.com/CHRC5IYBdhLWcg3wJNgN - Evan Knowles
@Evan 谢谢。我只对Java感兴趣,所以那看起来是一个有用的资源。 - peter.murray.rust
1个回答

10

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

String s = Pattern.quote(orig);

“引用”的字符串将会被转义其所有的元字符。首先需要转义你的字符串,接着查找并替换其中的数字为\d以生成一个正则表达式。由于正则表达式库使用\Q\E进行引用,所以你需要在\E\Q的反引号中包含你的正则表达式部分。

我会在你的实现中改变替换算法:不必逐个字符替换,而是替换数字组。这将允许从第3页,共23页生成的表达式匹配像第13页,共23页第6页,共8页的字符串。

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

无论原始页面编号和计数是什么,这将产生 "\QPage \E\d+\Q of \E\d+\Q\E"。输出中的\d只需要一个斜杠,因为结果直接传递给正则表达式引擎,绕过了Java编译器。


很酷,我不知道这个方法。 - toniedzwiedz
@peter.murray.rust 看到最后一次编辑:为了在输出中得到两个斜杠,所需的斜杠数量真是荒谬 - 编译器需要两次,正则表达式库也需要两次,总共需要八个斜杠。 - Sergey Kalinichenko
1
@dasblinkenlight。这就是为什么我感激你创建它的原因!我需要很长时间才能得到正确的数字!(我倾向于使用常量来帮助分解) - peter.murray.rust
我认为这个答案包含了我需要的一切,并且可以扩展,所以我已经接受了它。 - peter.murray.rust
@peter.murray.rust 这就是为什么我写道你需要先转义字符串,然后再进行替换。 - Sergey Kalinichenko
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接