java - 在java模式匹配器(正则表达式)中如何迭代每个文本并用不同的文本替换
问题描述
我想检查模式匹配,如果模式匹配,那么我想用给定索引处的测试数组中的元素替换那些文本匹配。
public class test {
public static void main(String[] args) {
String[] test={"one","two","three","four"}
Pattern pattern = Pattern.compile("\\$(\\d)+");
String text="{\"test1\":\"$1\",\"test2\":\"$5\",\"test3\":\"$3\",\"test4\":\"$4\"}";
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
System.out.println(matcher.groupCount());
System.out.println(matcher.replaceAll("test"));
}
System.out.println(text);
}
}
我希望最终结果文本字符串采用以下格式:
{\"test1\":\"one\",\"test2\":\"$two\",\"test3\":\"three\",\"test4\":\"four\"}
但是 while 循环在一场比赛后退出,并"test"
在任何地方被替换,如下所示:
{"test1":"test","test2":"test","test3":"test","test4":"test"}
使用下面的代码我得到了结果:
public class test {
public static void main(String[] args) {
String[] test={"one","two","three","four"};
Pattern pattern = Pattern.compile("\\$(\\d)+");
String text="{\"test1\":\"$1\",\"test2\":\"$2\",\"test3\":\"$3\",\"test4\":\"$4\"}";
Matcher m = pattern.matcher(text);
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, test[Integer.parseInt(m.group(1)) - 1]);
}
m.appendTail(sb);
System.out.println(sb.toString());
}
}
但是,如果我有一个像这样的替换文本数组,
String[] test={"$$one","two","three","four"};
然后,由于$$
,我在线程“main”中遇到异常:
java.lang.IllegalArgumentException:java.util.regex.Matcher.appendReplacement(Matcher.java:857)处的非法组引用**
解决方案
以下行是您的问题:
System.out.println(matcher.replaceAll("test"));
如果删除它,循环将遍历所有匹配项。
作为您的问题的解决方案,您可以将循环替换为以下内容:
对于 Java 8:
StringBuffer out = new StringBuffer();
while (matcher.find()) {
String r = test[Integer.parseInt(matcher.group(1)) - 1];
matcher.appendReplacement(out, r);
}
matcher.appendTail(out);
System.out.println(out.toString());
对于 Java 9 及更高版本:
String x = matcher.replaceAll(match -> test[Integer.parseInt(match.group(1)) - 1]);
System.out.println(x);
这只有在你$5
用$2
which 替换我认为是你的目标时才有效。
关于$
替换字符串中的符号,文档指出:
美元符号 ($) 可以作为文字包含在替换字符串中,方法是在其前面加上反斜杠 (\$)。
换句话说,您必须将替换数组编写为String[] test = { "\\$\\$one", "two", "three", "four" };
推荐阅读
- c++ - 在多文件项目中重新定义“int main()”。C++
- android - Pixel3a 手机上 opencv 4.5.0 android-sdk 的链接错误
- java - 在java字符串中的运算符前后添加空格
- c++ - remove() 遇到问题
- javascript - 我的 switch 语句有问题。继续使用默认值
- sharepoint - 此页面的安全验证无效并且可能已损坏。请使用您的网络浏览器的返回按钮再次尝试您的操作
- python - 过滤数据帧子集的更有效方法
- nuxt.js - 如何在 Nuxt 的组合 API 中使用 vuex 地图助手
- mysql - 如果在过去 10 天内更新了任何 TimeEntries,则条件 SQL 查询将相关任务的所有 TimeEntires 相加
- php - 即使通过应用密码进行身份验证,Yandex 电子邮件帐户也会被阻止