【问题标题】:Java + How can I replace string containing '(' with '\\(' to for pattern.compile regular expression [duplicate]Java +如何将包含'('的字符串替换为'\\('以用于pattern.compile正则表达式[重复]
【发布时间】:2015-07-25 02:58:55
【问题描述】:

我有以下代码

StringToSearchIn ="Hello word (Figure 1)"; 
patternString= "word (Figure 1)" 
Pattern pattern = Pattern.compile(patternString);       
Matcher matcher = pattern.matcher(StringToSearchIn);
matcher.find()

这是返回 0,因为 '( or )' 无法识别,当我更改为 patternString= "word \\(Figure 1\\)" ,将匹配计数器返回为 1 有没有办法将我的 patternString 更改为搜索 '(' 并在创建模式之前动态替换为 '\\('

提前致谢。

【问题讨论】:

  • 我不确定,但听起来您要求的是匹配“(图 1)”的正则表达式?或者'('后跟任何东西,然后是')'?
  • 谢谢大家,它适用于 Pattern.quote(String regex);

标签: java regex matcher


【解决方案1】:

使用Pattern#quote(String regex):

Pattern pattern = Pattern.compile(Pattern.quote(patternString));

【讨论】:

    【解决方案2】:

    您可以使用 LITERAL 标志。

    http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#LITERAL:

    启用模式的文字解析。指定此标志时 然后指定模式的输入字符串被视为 文字字符的序列。元字符或转义序列 输入序列不会被赋予特殊含义。

    所以在你的代码中:

    Pattern pattern = Pattern.compile(patternString, Pattern.LITERAL);
    

    【讨论】:

      【解决方案3】:
      Pattern.quote("$5");
      

      从这个答案:

      How to escape text for regular expression in Java

      【讨论】:

        【解决方案4】:

        Java 内置了模式转换。

        模式是正则表达式的编译表示。 指定为字符串的正则表达式必须首先编译为此类的实例。然后可以使用生成的模式创建一个 Matcher 对象,该对象可以将任意字符序列与正则表达式匹配。执行匹配所涉及的所有状态都驻留在匹配器中,因此许多匹配器可以共享相同的模式。

        因此,典型的调用序列是 paternString.replace

         Pattern p = Pattern.compile("a*b");
         Matcher m = p.matcher("aaaaab");
         boolean b = m.matches();
        

        该类定义了一个matches方法,以方便正则表达式只使用一次。此方法在一次调用中编译一个表达式并匹配一个输入序列。声明

         boolean b = Pattern.matches("a*b", "aaaaab");
        

        如果编译没有处理你的括号,你可以添加一个注入字符串替换的方法。

        patternString = patternString.replace('(', '\('); 
        patternString = patternString.replace(')', '\)'); 
        

        【讨论】:

          猜你喜欢
          • 2015-09-17
          • 1970-01-01
          • 2020-08-25
          • 1970-01-01
          • 1970-01-01
          • 2014-08-25
          • 1970-01-01
          • 1970-01-01
          • 2023-04-09
          相关资源
          最近更新 更多