13

在 Java 中,假设我有一个字符串变量 S,我想在另一个字符串 T 中搜索它,如下所示:

   if (T.matches(S)) ...

(注意:上面的行是 T.contains() 直到一些帖子指出该方法不使用正则表达式。我的错。)

但是现在假设 S 中可能有令人讨厌的字符。例如,让 S = "[hi"。左方括号将导致正则表达式失败。有没有我可以调用的函数来转义 S 以免发生这种情况?在这种特殊情况下,我希望将其转换为“\[hi”。

4

6 回答 6

20

String.contains 不使用正则表达式,因此在这种情况下没有问题。

如果需要正则表达式,而不是拒绝带有正则表达式特殊字符的字符串,请使用 java.util.regex.Pattern.quote 转义它们。

于 2008-10-03T20:04:49.910 回答
12

正如Tom Hawtin所说,您需要引用该模式。您可以通过两种方式做到这一点(编辑:实际上是三种方式,正如@diastrophism所指出的那样):

  1. 用“\Q”和“\E”包围字符串,如:

    if (T.matches("\\Q" + S + "\\E"))
    
  2. 改用图案。代码将是这样的:

    Pattern sPattern = Pattern.compile(S, Pattern.LITERAL);
    if (sPattern.matcher(T).matches()) { /* do something */ }
    

    这样,您可以缓存已编译的 Pattern 并重用它。如果您多次使用相同的正则表达式,您几乎肯定希望这样做。

请注意,如果您使用正则表达式来测试一个字符串是否在一个较大的字符串中,您应该将 .* 放在表达式的开头和结尾。但是,如果您引用该模式,这将不起作用,因为它将寻找实际的点。那么,您确定要使用正则表达式吗?

于 2008-10-03T20:59:24.213 回答
6

试试Pattern.quote(String)。它将修复字符串中具有特殊含义的任何内容。

于 2008-10-03T22:24:07.490 回答
2

有什么特别的理由不使用 String.indexOf() 代替吗?这样,它将始终被解释为常规字符串而不是正则表达式。

于 2008-10-03T20:01:29.057 回答
0

正则表达式使用反斜杠字符“\”来转义文字。鉴于 java 还使用反斜杠字符,您需要使用双 bashslash,例如:

   String S = "\\[hi"

这将成为字符串:

  \[hi

这将传递给正则表达式。

或者,如果您只关心文字字符串并且不需要正则表达式,您可以执行以下操作:

if (T.indexOf("[hi") != -1)  {
于 2008-10-03T20:08:29.137 回答
0

T.contains() (根据 javadoc : http: //java.sun.com/javase/6/docs/api/java/lang/String.html)不使用正则表达式。contains() 仅代表 indexOf()。

所以,这里没有使用正则表达式。您是否在考虑其他一些 String 方法?

于 2008-10-03T20:16:20.963 回答