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)
8条答案
按热度按时间4zcjmb1e1#
从Java 1.5开始,是的:
7kqas0il2#
在看到以下示例之前,我并不清楚
Pattern.quote
和Matcher.quoteReplacement
之间的区别ukxgm1gy3#
现在响应可能为时已晚,但您也可以使用
Pattern.LITERAL
,它将在格式化时忽略所有特殊字符:egmofgnx4#
我认为你所追求的是
\Q$5\E
。另请参见Java5中引入的Pattern.quote(s)
。有关详细信息,请参见Pattern javadoc。
yyhrrdl85#
首先如果
它不会在末尾添加1,而是在搜索正则表达式中查找第一个匹配的组,并将THAT代入其中。这就是$1、$2或$3在替换文本中的含义:匹配来自搜索模式的组。
我经常将很长的文本字符串插入到. properties文件中,然后从中生成电子邮件主题和正文。实际上,这似乎是Spring Framework中执行i18n的默认方式。我将XML标记作为占位符放入字符串中,然后使用replaceAll()在运行时用值替换XML标记。
我遇到了一个问题,用户输入了一个美元和美分的数字,带有一个美元符号。replaceAll()卡住了,在tracktrace中显示了以下内容:
在本例中,用户在其输入中的某个地方输入了"$3",replaceAll()在搜索正则表达式中查找第三个匹配的组,没有找到,然后吐了。
给定:
替换
与
解决了这个问题。用户可以输入任何类型的字符,包括美元符号,没有问题。它的行为完全符合您的预期。
xeufq47z6#
要有受保护的模式,你可以用“\\"替换所有的符号,除了数字和字母。然后你可以把你的特殊符号放进受保护的模式,使这个模式不像愚蠢的引用文本,而是真正像一个模式,而是你自己的。没有用户特殊符号。
nafvub8i7#
Pattern.quote(“blabla”)很好用。
Pattern.quote()很好用。它用字符“\Q”和“\E"将句子括起来,如果它确实转义了“\Q”和“\E”。但是,如果你需要进行真实的的正则表达式转义(或自定义转义),你可以使用下面的代码:
此方法返回:* 部分/\s/w文本 /\,**
示例和测试代码:
qyuhtwio8#
^(否定)符号用于匹配不在字符组中的内容。
这是指向Regular Expressions的链接
下面是关于否定的图像信息: