「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 つのグループを最初と 3 番目のグループに置き換え、2 番目のグループを削除します。
あなたはほとんどそこにいますが、それは文字列全体を削除します. Galery
との間の何かを削除したい場合はjssdK));
、次のようにする必要があります。
String newStr = newsValues[1].replaceAll("(Galery)(.*?)(jssdK\\)\\);)","$1$3");
これにより、文字列がグループに入れられ、これらのグループを使用して文字列全体が置き換えられます。正規表現構文では、)
は特殊文字であるため、エスケープする必要があることに注意してください。
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" を割り当てることができます