我希望从包含数字的字符串生成正则表达式,然后使用它作为模式来搜索相似的字符串。例子:
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 http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html但担心错过一些东西)。
或者是否有一个库已经做到了这一点(我现阶段不想使用完整的自然语言处理解决方案)。
注意:@dasblinkenlight 编辑后的答案现在对我有用!
Java 正则表达式库提供了此功能:
String s = Pattern.quote(orig);
“引用”字符串将转义其所有元字符。首先,转义字符串,然后遍历它并将数字替换为\d
制作正则表达式。由于正则表达式库使用\Q
and \E
为了引用,您需要将正则表达式的部分括在以下的反引号中\E
and \Q
.
我在实现中要改变的一件事是替换算法:我不会逐个字符地替换,而是成组地替换数字。这将使产生的表达式Page 3 of 23
匹配字符串,例如Page 13 of 23
and Page 6 of 8
.
String p = Pattern.quote(orig).replaceAll("\\d+", "\\\\E\\\\d+\\\\Q");
这个会produce http://ideone.com/fvo6V9 "\QPage \E\d+\Q of \E\d+\Q\E"
无论最初的页码和计数是多少。输出只需要一个斜杠,而不是两个斜杠\d
,因为结果直接输入正则表达式引擎,绕过 Java 编译器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)