Java替换字符串中的精确子字符串
我有以下字符串:Java替换字符串中的精确子字符串,java,regex,string,str-replace,Java,Regex,String,Str Replace,我有以下字符串: 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.contain
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(“,”)
,然后筛选字符串数组中生成的项。最终我会加入他们(如果您不受运行时的限制)
类似(未经测试):
- 拆分可以替换为筛选列表的
List matches=new ArrayList();
Matcher m=Pattern.compile((^[12],|,[12],|[12]$)).Matcher(“[1,6,20,9,10,19,11,5,3,1,2”);
if(m.find()){
做{
System.out.println(“匹配的”+m.group());
匹配。添加(m.group());
}而(m.find(m.start()+1));
}
for(字符串匹配:匹配){
系统输出打印项次(匹配);
}
您可以尝试分析两种方法的运行时,并可能在稍后扩展我的答案:-)我认为问题是“如何从列表中删除值”,但仅限于确切的值(例如,2不是12,13不是413),以及缩短列表,即删除前面或后面的逗号(如果有),但不能同时删除这两个逗号
简短答复:
String x=Pattern.quote(textToRemove);
模式p=Pattern.compile(“^”+x+“$|^”+x+”,|,“+x+”$|,“+x+”(?=,)”);
字符串输出=p.matcher(输入).replaceAll(“”;//还是先替换
示例:
输入:“6,20,9,10,19101,5,3,1,2”
删除“2”:“6,20,9,10,19101,5,3,1”--最后一个值,不要删除20
删除“20”:“6,9,10,19101,5,3,1,2”--中间值
删除“1”:“6,20,9,10,19101,5,3,2”--不要删除10,19或101
删除“10”:“6,20,9,19101,5,3,1,2”--不要删除101
删除“6”:“20,9,10,19101,5,3,1,2”--第一个值
删除“77”:“6,20,9,10,19101,5,3,1,2”--未删除任何内容
输入:“6”
删除“6”:“”--仅限值
代码:
私有静态无效测试(字符串输入、字符串文本删除){
字符串rmv=Pattern.quote(textToRemove);
Pattern p=Pattern.compile(“^”+rmv+“$”++//只匹配值
“^”+rmv+”,“+//匹配第一个值+”,”
“|,”+rmv+“$”+//匹配“,”+最后一个值
“|,“+rmv+”(?=,)”;//匹配',“+中间值(+',”)
字符串输出=p.matcher(输入).replaceAll(“”;//或replaceFirst
System.out.printf(“从%26s中删除%4s:%s%n”,
“'+textToRemove+'”,
“'+input+'”,
“+”输出+“”);
}
测试:
publicstaticvoidmain(字符串[]args)引发异常{
//
测试(“6,20,9,10,19101,5,3,1,2,2”);
测试(“6,20,9,10,19101,5,3,1,2,20”);
测试(“6,20,9,10,19101,5,3,1,2”,“1”);
测试(“6,20,9,10,19101,5,3,1,2,10”);
测试(“6,20,9,10,19101,5,3,1,2,6”);
测试(“6,20,9,10,19101,5,3,1,2,77”);
测试(“6”、“6”);
}
输出:
从“6,20,9,10,19101,5,3,1,2”中删除“2”:“6,20,9,10,19101,5,3,1”
从“6,20,9,10,19101,5,3,1,2”中删除“20”:“6,9,10,19101,5,3,1,2”
从“6,20,9,10,19101,5,3,1,2”中删除“1”:“6,20,9,10,19101,5,3,2”
从“6,20,9,10,19101,5,3,1,2”中删除“10”:“6,20,9,19101,5,3,1,2”
从“6,20,9,10,19101,5,3,1,2”中删除“6”:“20,9,10,19101,5,3,1,2”
从“6,20,9,10,19101,5,3,1,2”中删除“77”:“6,20,9,10,19101,5,3,1,2”
从“6”中删除“6”:
但在这种情况下,我必须循环查找元素,删除它,最后连接所有元素以重新构建字符串。我认为replace()方法是否更快?取决于您尝试执行的操作。字符串操作对于运行时来说不是很好,所以我明确地说,只有在不受约束的情况下,这才是一个解决方案。如果你能详细说明你的限制条件,我肯定能找到一个更好的解决方案。事实上,我问在这种情况下是否有一个特定的正则表达式可以帮助我,或者我发布的代码是否有错。我在回答中添加了更多的细节。我不承担任何责任。
String[] splits = myString.split(",");
// ... manipulate splits (filter into a list if you want...)
StringUtils.join(splits, ", "); // possibly replace with array from filtered list
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);
}