2017-07-21 14 views
3

現在、ツールの開発を進めています。これは、常に成長しているStringを分析するのに役立ちます。String s = "AAAAAAABBCCCDDABQ"のようになります。私がしたいことは、AとBのシーケンスを見つけて、何かをして元のStringからそのシーケンスを削除することです。Javaの文字列からパターンを削除する

私のコードは次のようになります。また

while (someBoolean){ 

    if(Pattern.matches("A+B+", s)) { 
     //Do stuff 
     //Remove the found pattern 
    } 

    if(Pattern.matches("C+D+", s)) { 
     //Do other stuff 
     //Remove the found pattern 
    } 

} 
return s; 

sだけのループなしと無限の、計算の最後に"Q"が含まれるように、どのように私は、3つのシーケンスを削除するだろうか?

+1

はいていますが、文字列のコピーを作成し、変更可能なローカル変数に格納することができます。 –

+0

私は自分自身を明言していません、申し訳ありません。 私のコードのどこかに、文字列の最後に "+ ="という文字を定期的に追加する関数があります。これは、 "成長する"という意味です。 – schande

+0

@schandeこの文字列にパターンがありますか、ランダムな文字を追加するだけですか? – CodingNinja

答えて

4

appendReplacement(StringBuffer sb, String replacement)appendTail(StringBuffer sb)の正規表現置換ループを使用する必要があります。

多くのパターンの1つを見つけるには、| regex matcherを使用して、それぞれのパターンを別々に取得します。

group(int group)を使用すると、各キャプチャグループ(最初のグループはグループ1)に一致する文字列を取得できます。一致しない場合はnullが返されます。パフォーマンスが向上するように、グループが一致したかどうかを単に確認するには、start(int group)を使用します。一致しない場合は-1を返します。

例:

String s = "AAAAAAABBCCCDDABQ"; 
StringBuffer buf = new StringBuffer(); 
Pattern p = Pattern.compile("(A+B+)|(C+D+)"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    if (m.start(1) != -1) { // Group 1 found 
     System.out.println("Found AB: " + m.group(1)); 
     m.appendReplacement(buf, ""); // Replace matched substring with "" 
    } else if (m.start(2) != -1) { // Group 2 found 
     System.out.println("Found CD: " + m.group(2)); 
     m.appendReplacement(buf, ""); // Replace matched substring with "" 
    } 
} 
m.appendTail(buf); 
String remain = buf.toString(); 
System.out.println("Remain: " + remain); 

出力

Found AB: AAAAAAABB 
Found CD: CCCDD 
Found AB: AB 
Remain: Q 
+0

偉大な答え。それはそれが価値があるので、私はそれを3回投票することができることを望む。 – CodingNinja

+0

ありがとうAndreas、それは私を助けてくれました。 :) – schande

1

このソリューションでは、文字列は常にあなたは、おそらくこのような何かを探していますQ.

String s="AAAAAAABBCCCDDABQ"; 

Pattern abPattern = Pattern.compile("A+B+"); 
Pattern cdPattern = Pattern.compile("C+D+"); 


while (s.length() > 1){ 

    Matcher abMatcher = abPattern.matcher(s); 
    if (abMatcher.find()) { 
     s = abMatcher.replaceFirst(""); 
     //Do other stuff 
    } 

    Matcher cdMatcher = cdPattern.matcher(s); 
    if (cdMatcher.find()) { 
     s = cdMatcher.replaceFirst(""); 
     //Do other stuff 
    } 

} 
System.out.println(s); 
+0

文字列が常にQで終わっていると仮定すると、 's = s.substring(s.length() - 1);'同じ効果が得られます。 – CodingNinja

0

に終了することを前提としています

String input = "AAAAAAABBCCCDDABQ"; 
String result = input; 
String[] chars = {"A", "B", "C", "D"}; // chars to replace 

for (String ch : chars) { 
    if (result.contains(ch)) { 
     String pattern = "[" + ch + "]+"; 
     result = result.replaceAll(pattern, ch); 
    } 
} 

System.out.println(input); //"AAAAAAABBCCCDDABQ" 
System.out.println(result); //"ABCDABQ" 

これは、基本的に単一のもののために、各文字の列に置き換えます。

シーケンスを完全に削除する場合は、ボディの中にreplaceAllメソッドのパラメータのch""を置き換えてください。

関連する問題