我想删除以 'galery' 开头并以 'jssdk));' 结尾的字符串中的所有子字符串
例如,考虑以下字符串:
Galery something something.... jssdk));
我需要一个算法来删除'something something...'并返回'Galery jssdk));'
这就是我所做的,但它不起作用。
newsValues[1].replaceAll("Galery.*?jssdK));", "");
可能可以改进,我做得很快:
public static String replaceMatching(String input, String lowerBound, String upperBound{
Pattern p = Pattern.compile(".*?"+lowerBound+"(.*?)"+upperBound+".*?");
Matcher m = p.matcher(input);
String textToRemove = "";
while(m.find()){
textToRemove = m.group(1);
}
return input.replace(textToRemove, "");
}
更新Thx 接受答案,但这里是一个较小的审查版本:
public static String replaceMatching2(String input, String lowerBound, String upperBound){
String result = input.replaceAll("(.*?"+lowerBound + ")" + "(.*?)" + "(" + upperBound + ".*)", "$1$3");
return result;
}
这个想法实际上很简单,将字符串分成 3 组,然后将这 3 组替换为第一组和第三组,删除第二组。
你快到了,但这会删除整个字符串。如果要删除 and 之间的任何内容Galery
,jssdK));
则必须执行以下操作:
String newStr = newsValues[1].replaceAll("(Galery)(.*?)(jssdK\\)\\);)","$1$3");
这会将字符串分组,然后使用这些组替换整个字符串。请注意,在正则表达式语法中,the)
是一个特殊字符,因此需要对其进行转义。
String str = "GaleryABCDEFGjssdK));";
String newStr = str.replaceAll("(Galery)(.*?)(jssdK\\)\\);)","$1$3");
System.out.println(newStr);
这产生:GaleryjssdK));
我知道@amit 提出的解决方案更简单,但是,我认为向您展示一种可以使用该replaceAll
方法的有用方式是个好主意。
最简单的解决方案是用“边缘”替换字符串,有效地“删除”它们之间的所有内容。
newsValues[1].replaceAll("Galery.*?jssdK));", "GaleryjssdK));");
1:我""
在这里使用它是因为它没有完全替换 - 记住字符串是不可变的,所以它正在创建一个新对象,没有“删除”部分。
newsValues[1] = newsValues[1].substring(0,6)+newsValues.substring(newsValues[1].length()-5,newsValues[1].length())
这基本上将“Galery”和“jssdk”连接起来,离开或忽略其他所有内容。更重要的是,您可以简单地分配 newValues[1] = "Galeryjssdk"