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


当前回答

这时响应可能为时已晚,但您也可以使用Pattern。LITERAL,它会在格式化时忽略所有特殊字符:

Pattern.compile(textToFormat, Pattern.LITERAL);

其他回答

Pattern.quote("blabla")工作得很好。

Pattern.quote()工作得很好。它用字符“\Q”和“\E”包围句子,如果它转义了“\Q”和“\E”。 然而,如果你需要做一个真正的正则表达式转义(或自定义转义),你可以使用以下代码:

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

该方法返回:Some/\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"));

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

有关详细信息,请参阅Pattern javadoc。

从Java 1.5开始,是的:

Pattern.quote("$5");

若要保护图案,可将除数字和字母外的所有符号替换为“\\\\”。之后,你可以在受保护的模式中加入你的特殊符号,使这个模式不像愚蠢的引用文本,而是真正像一个模式,但你自己的。无用户专用符号。

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");
    }
}

^(否定)符号用于匹配不在字符组中的内容。

这是正则表达式的链接

下面是关于否定的图片信息: