从在 Java 中解析正则表达式中转义字符串
在Java中,假设我有一个字符串变量S,我想在另一个字符串T中搜索它,如下所示:
if (T.matches(S)) ...
(注意:上面的行是T.contains(),直到一些帖子指出该方法不使用正则表达式。我的坏。
但现在假设S中可能有令人讨厌的字符。例如,设 S = “[hi”。左方括号将导致正则表达式失败。有没有一个函数我可以调用来转义S,这样就不会发生这种情况?在这种特殊情况下,我希望将其转换为“\[hi”。
在Java中,假设我有一个字符串变量S,我想在另一个字符串T中搜索它,如下所示:
if (T.matches(S)) ...
(注意:上面的行是T.contains(),直到一些帖子指出该方法不使用正则表达式。我的坏。
但现在假设S中可能有令人讨厌的字符。例如,设 S = “[hi”。左方括号将导致正则表达式失败。有没有一个函数我可以调用来转义S,这样就不会发生这种情况?在这种特殊情况下,我希望将其转换为“\[hi”。
String.contains 不使用正则表达式,因此在这种情况下没有问题。
如果需要正则表达式,而不是拒绝具有正则表达式特殊字符的字符串,请使用java.util.regex.Pattern.quote来转义它们。
正如Tom Hawtin所说,你需要引用这种模式。你可以用两种方式做到这一点(编辑:实际上有三种方式,正如@diastrophism所指出的那样):
用“\Q”和“\E”将字符串括起来,如下所示:
if (T.matches("\\Q" + S + "\\E"))
请改用模式。代码将如下所示:
Pattern sPattern = Pattern.compile(S, Pattern.LITERAL);
if (sPattern.matcher(T).matches()) { /* do something */ }
这样,您就可以缓存已编译的模式并重用它。如果您多次使用相同的正则表达式,则几乎肯定希望以这种方式执行此操作。
请注意,如果使用正则表达式来测试字符串是否位于较大的字符串内,则应将 .* 放在表达式的开头和结尾。但是,如果您引用该模式,这将不起作用,因为它将寻找实际的点。那么,你绝对确定你想使用正则表达式吗?