我有以下字符串:
String str = "6,20,9,10,19,11,5,3,1,2";
我想将确切的字符串 ,2
或 1,
替换为空字符串,避免使用子字符串 ,20
或11,
参与了替换。
我有这个代码:
// assuming that substr = ",2" or "1,"
if(str.startsWith(substr+",")){
str = str.replace("^"+substr+",$","");
}
else if(str.contains(","+substr+",")){
str = str.replace("^"+substr+",$","");
}
else if(str.endsWith(","+substr)){
str = str.replace("^,"+substr+"$","");
}
但看来我的正则表达式是错误的。我应该使用哪个正则表达式来解决它?
最佳答案
我的回答是:“你想要实现什么目标?”
如果您尝试过滤,我会选择String.split(",")
,然后过滤字符串数组中生成的项目。最终我会加入他们(如果你不受运行时的限制)。
类似于(未经测试):
String[] splits = myString.split(",");
// ... manipulate splits (filter into a list if you want...)
StringUtils.join(splits, ", "); // possibly replace with array from filtered list
- 分割可以替换为过滤列表的 toArray
按照您的方式解决这个问题可能会很棘手。当您尝试匹配一个项目时,您就消除了匹配其邻居的机会。您需要做的是匹配聚合。
这只是一个开始(未经测试,基于this):
List<String> matches = new ArrayList<String>();
Matcher m = Pattern.compile("(^[12],|,[12],|[12]$)").matcher("1,6,20,9,10,19,11,5,3,1,2");
if (m.find()) {
do {
System.out.println("Matched "+m.group());
matches.add(m.group());
} while (m.find(m.start()+1));
}
for (String match : matches){
System.out.println(match);
}
您可以尝试分析这两种方式的运行时,也许稍后会扩展我的答案:-)
关于Java从字符串中替换精确的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21405699/