代码之家  ›  专栏  ›  技术社区  ›  doodaddy

从Java中获取ReGEX解析的字符串

  •  12
  • doodaddy  · 技术社区  · 16 年前

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

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

    (注意:上面的行是t.contains(),直到一些文章指出该方法不使用正则表达式。我的坏消息。

    但现在假设S中可能有令人讨厌的字符。例如,让我们=“[嗨]。左方括号将导致regex失败。有没有一个函数可以调用来逃避S,这样就不会发生这种情况?在这个特殊的例子中,我希望它被转换成\[你好]。

    6 回复  |  直到 12 年前
        1
  •  20
  •   Tom Hawtin - tackline    16 年前

    string.contains不使用regex,因此在这种情况下没有问题。

    如果需要regex,而不是拒绝带有regex特殊字符的字符串,请使用java.util.regex.pattern.quote来转义它们。

        2
  •  11
  •   Community CDub    8 年前

    AS 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 */ }
      

      这样,您就可以缓存已编译的模式并重用它。如果您不止一次使用同一个regex,那么您几乎肯定希望这样做。

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

        3
  •  6
  •   Diastrophism    16 年前

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

        4
  •  2
  •   Jay    16 年前

    有没有什么特别的原因不使用string.indexof()?这样,它将始终被解释为正则字符串而不是正则表达式。

        5
  •  0
  •   Aaron    16 年前

    regex使用反斜杠字符'\'来转义文字。假设Java还使用反斜杠字符,则需要使用双BasHSLASH:

       String S = "\\[hi"
    

    这将成为字符串:

      \[hi
    

    将传递给regex。

    或者,如果您只关心文本字符串,不需要regex,那么可以执行以下操作:

    if (T.indexOf("[hi") != -1)  {
    
        6
  •  0
  •   anjanb    16 年前

    t.contains()(根据javadoc: http://java.sun.com/javase/6/docs/api/java/lang/String.html )不使用正则表达式。只包含()对indexof()的委托。

    所以,这里没有使用正则表达式。你在想其他的弦方法吗?