Java是否有内置的方法来转义任意文本,以便它可以包含在正则表达式中? 例如,如果我的用户输入"$ 5",我想在输入结束后完全匹配而不是"5"。
从Java 1.5开始,是的:
在看到下面的例子之前,我并不清楚Pattern.quote和Matcher.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")); |
^(否定)符号用于匹配不在字符组中的内容。
这是正则表达式的链接
这是关于否定的图像信息: