如何在Java中为正则表达式转义文本?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (7)
  • 关注 (0)
  • 查看 (106)

Java是否有一种内置的方式来转义任意文本,以便它可以包含在正则表达式中? 例如,如果我的用户输入“$ 5”,我希望在输入结束后确切地匹配而不是“5”。

提问于
用户回答回答于
用户回答回答于

Pattern.quote(“blabla”)

Pattern.quote()用“\ Q”和“\ E”包围句子,确实转义了“\ Q”和“\ E”。 但是,如果你需要做一个真正的正则表达式转义(或自定义转义),你可以使用下面的代码:

String someText = "Some/s/wText*/,**";
System.out.println(someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));

该方法将返回:一些/\s/wText*/、**

示例代码和测试内容:

String someText = "Some\\E/s/wText*/,**";
System.out.println("Pattern.quote: "+ Pattern.quote(someText));
System.out.println("Full escape: "+someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
用户回答回答于

要有保护模式,您可以用“\\\\”替换所有符号,数字和字母除外。 之后,你可以在这个受保护的模式中加入你的特殊符号,使这个模式不像一般的引用文本, 没有特殊的用户符号。

public class Test {
    public static void main(String[] args) {
        String str = "y z (111)";
        String p1 = "x x (111)";
        String p2 = ".* .* \\(111\\)";

        p1 = escapeRE(p1);

        p1 = p1.replace("x", ".*");

        System.out.println( p1 + "-->" + str.matches(p1) ); 
            //.*\ .*\ \(111\)-->true
        System.out.println( p2 + "-->" + str.matches(p2) ); 
            //.* .* \(111\)-->true
    }

    public static String escapeRE(String str) {
        //Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
        //return escaper.matcher(str).replaceAll("\\\\$1");
        return str.replaceAll("([^a-zA-Z0-9])", "\\\\$1");
    }
}
用户回答回答于

如果

  • 使用replaceAll()
  • 不使用Matcher.quoteReplacement()
  • 要被替换的文本包括$ 1

它不会把1放在最后。它将查看第一个匹配组的搜索正则表达式,并将其细分。这就是$1,2或$3在替换文本中的含义:匹配来自搜索模式的组。

我经常把长串的文字插进去.properties files,然后生成电子邮件主题和正文。实际上,这似乎是Spring框架中执行i18n的默认方式。我将XML标记作为占位符放入字符串中,并在运行时使用replaceAll()替换XML标记。

我遇到一个问题,一个用户输入dollars-and-cents,附带一个美元的标志,在stracktrace中:

java.lang.IndexOutOfBoundsException: No group 3
at java.util.regex.Matcher.start(Matcher.java:374)
at java.util.regex.Matcher.appendReplacement(Matcher.java:748)
at java.util.regex.Matcher.replaceAll(Matcher.java:823)
at java.lang.String.replaceAll(String.java:2201)

在这种情况下,用户在输入的某个地方输入了“$3”,然后replaceAll()在搜索regex中查找第三个匹配组,没有找到,然后退出。

// "msg" is a string from a .properties file, containing "<userInput />" among other tags
// "userInput" is a String containing the user's input

替代

msg = msg.replaceAll("<userInput \\/>", userInput);

附带

msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));

解决了问题。用户可以在任何情况下输入任何类型的字符,包括美元符号。

用户回答回答于

如果你想要\Q$5\E。 另请参阅Java5中引入的Pattern.quote(s)

pattern有关详细信息。

用户回答回答于

您可以使用Pattern.LITERAL,在格式化时忽略所有特殊字符:

Pattern.compile(textToFormat, Pattern.LITERAL);
用户回答回答于

以下的例子并不能很好地区分Pattern.quoteMatcher.quoteReplacement之间的区别

s.replaceFirst(Pattern.quote("text to replace"), 
               Matcher.quoteReplacement("replacement text"));

扫码关注云+社区

领取腾讯云代金券