Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java替换字符串中的精确子字符串_Java_Regex_String_Str Replace - Fatal编程技术网

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);
    }