Java是否有一种内置的方法来转义任意文本,以便它可以包含在正则表达式中?例如,如果我的用户输入“$5”,我希望精确匹配它,而不是在输入结束后输入“5”。
当前回答
首先,如果
你使用replaceAll() 你不使用Matcher.quoteReplacement() 要替换的文本包括$1
它不会在后面加1。它将查看第一个匹配组的搜索正则表达式并将THAT插入。这就是$1、$2或$3在替换文本中的含义:匹配搜索模式中的组。
我经常在.properties文件中插入长串文本,然后从这些文本生成电子邮件主题和正文。实际上,这似乎是Spring Framework中执行i18n的默认方式。我将XML标记作为占位符放入字符串中,并在运行时使用replaceAll()将XML标记替换为值。
我遇到了一个问题,用户输入了一个美元和美分的数字,上面有一个美元符号。replaceAll()阻塞了它,在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()在搜索正则表达式中寻找第三个匹配组,但没有找到,于是吐了出来。
考虑到:
// "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));
解决了问题。用户可以毫无问题地输入任何类型的字符,包括美元符号。它的表现完全符合你的预期。
其他回答
这时响应可能为时已晚,但您也可以使用Pattern。LITERAL,它会在格式化时忽略所有特殊字符:
Pattern.compile(textToFormat, Pattern.LITERAL);
模式之间的差异。引用和Matcher。在我看到下面的例子之前,我不清楚
s.replaceFirst(Pattern.quote("text to replace"),
Matcher.quoteReplacement("replacement text"));
^(否定)符号用于匹配不在字符组中的内容。
这是正则表达式的链接
下面是关于否定的图片信息:
我想你想要的是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中显示如下:
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()在搜索正则表达式中寻找第三个匹配组,但没有找到,于是吐了出来。
考虑到:
// "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));
解决了问题。用户可以毫无问题地输入任何类型的字符,包括美元符号。它的表现完全符合你的预期。
推荐文章
- Java构造函数继承
- 如何在Java中将int[]转换为Integer[] ?
- 你能解释一下流的概念吗?
- 导致java.lang.VerifyError错误的原因
- 如何在Java中监控计算机的CPU、内存和磁盘使用情况?
- 如何设置超时在改造库?
- java lambda可以有一个以上的参数吗?
- HashMap -获取第一个键值
- 使用Jackson将JSON字符串转换为漂亮的打印JSON输出
- Android - SPAN_EXCLUSIVE_EXCLUSIVE跨度不能为零长度
- Javadoc @see或{@link}?
- 在准备语句中使用“like”通配符
- Android Eclipse -无法找到*.apk
- 如何将“camelCase”转换为“Camel Case”?
- javac和Eclipse编译器之间的区别是什么?