关于正则表达式:如何在Java中转义正则表达式的文本

How to escape text for regular expression in Java

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


从Java 1.5开始,是的:

1
Pattern.quote("$5");

在看到下面的例子之前,我并不清楚Pattern.quoteMatcher.quoteReplacement之间的区别

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


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

1
Pattern.compile(textToFormat, Pattern.LITERAL);

我想你所追求的是\Q$5\E。另请参阅Java5中介绍的Pattern.quote(s)

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


首先,如果

  • 你使用replaceAll()
  • 你不要使用Matcher.quoteReplacement()
  • 要替换的文本包括1美元

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

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

我遇到了一个问题,用户输入一个带有美元符号的美元和美分数字。 replaceAll()在它上面被阻塞,以下是一个stracktrace:

1
2
3
4
5
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()在搜索正则表达式中查找第三个匹配组,没有找到,并且puked。

鉴于:

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

更换

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

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

解决了这个问题。用户可以放入任何类型的字符,包括美元符号,没有问题。它的表现完全符合您的预期。


要使用受保护的模式,您可以用""替换所有符号,但数字和字母除外。之后,你可以在这个受保护的模式中添加你的特殊符号,使这个模式不像愚蠢的引用文本,但真的像一个模式,但你自己。没有用户特殊符号。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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");
    }
}


Pattern.quote("blabla")效果很好。

Pattern.quote()工作得很好。它用句子" Q"和" E"括起句子,如果它确实转义为" Q"和" E"。
但是,如果您需要进行真正的正则表达式转义(或自定义转义),您可以使用以下代码:

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

此方法返回:some / s / wText * / ,**

代码示例和测试:

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

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

这是正则表达式的链接

这是关于否定的图像信息:

Info about negation


推荐阅读

    linux文本查询命令?

    linux文本查询命令?,标准,命令,文件,工具,数据,信息,位置,系统,内容,文本,Lin

    linux压缩文本的命令?

    linux压缩文本的命令?,系统,图片,命令,设备,工具,位置,软件,管理,文件,目录,

    linux命令中转义字符?

    linux命令中转义字符?,标准,本行,密码,字符,电脑,系统,环境,数据,命令,终端,l

    linux输入文本命令?

    linux输入文本命令?,系统,位置,电脑,工作,首开,命令,终端,模式,指令,字符,如

    linux替换文本命令?

    linux替换文本命令?,信息,系统,命令,内容,文件,文本,字符串,字符集,单词,字

    linux替换文本的命令?

    linux替换文本的命令?,系统,地址,工作,信息,命令,标准,数据,内容,文件,字符

    linux命令空格转义?

    linux命令空格转义?,系统,密码,名称,管理,数据,标准,电脑,空格,命令,终端,lin

    linux编辑文本命令行?

    linux编辑文本命令行?,工作,系统,信息,状态,地址,命令,管理,标准,目录,文件,L

    linux查看文本的命令?

    linux查看文本的命令?,系统,工作,标准,信息,命令,管理,数据,文件,目录,时间,L

    linux文本中插入命令?

    linux文本中插入命令?,工作,地址,系统,命令,信息,第一,工具,地方,密码,情况,L

    linux文本撤销命令?

    linux文本撤销命令?,系统,命令,信息,环境,状态,进程,程序,终端,快捷键,用户,

    linux命令中创建文本?

    linux命令中创建文本?,系统,时间,文件,终端,名字,名称,发行,命令,文件夹,文

    linux文本编辑命令?

    linux文本编辑命令?,工作,系统,地址,信息,环境,基础,命令,入口,网站,技术,lin

    linux命令正则表达式?

    linux命令正则表达式?,工作,环境,基础,网络,单位,名称,平台,信息,正规,管理,L

    查找文本的linux命令?

    查找文本的linux命令?,工具,命令,信息,系统,标准,文件,终端,情况,内容,字符

    linux过滤命令正则?

    linux过滤命令正则?,系统,工具,灵活,信息,命令,工作,字符串,文件,文本,目录,L

    linux文本下的命令?

    linux文本下的命令?,地址,工作,系统,标准,信息,命令,数据,目录,文件,控制台,L

    linux命令行文本比较?

    linux命令行文本比较?,时间,系统,标准,状态,代码,设备,工具,软件,文件,命令,l

    linux命令行文本移动?

    linux命令行文本移动?,系统,工作,地址,信息,命令,目录,文件,时间,管理,标准,l

    编辑文本的linux命令?

    编辑文本的linux命令?,工作,系统,信息,命令,标准,数据,资料,目录,文件,操作,L