转义String以获取在Java中解析的正则表达式

时间:2008-10-03 19:59:43

标签: java regex string escaping

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

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

(注意:上面的行是T.contains(),直到有几篇文章指出该方法不使用正则表达式。我的不好。)

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

6 个答案:

答案 0 :(得分:20)

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

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

答案 1 :(得分:12)

Tom Hawtin所述,您需要引用该模式。您可以通过两种方式执行此操作(编辑:实际上有三种方式,如@ diastrophism所指出的那样):

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

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

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

    这样,您可以缓存已编译的Pattern并重用它。如果你不止一次使用同一个正则表达式,你几乎肯定想要这样做。

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

不使用String.indexOf()的任何特殊原因?这样它将始终被解释为常规字符串而不是正则表达式。

答案 4 :(得分:0)

正则表达式使用反斜杠字符'\'来转义文字。鉴于java也使用反斜杠字符,您需要使用双重缓冲区,如:

   String S = "\\[hi"

那将成为字符串:

  \[hi

将传递给正则表达式。

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

if (T.indexOf("[hi") != -1)  {

答案 5 :(得分:0)

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

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