2016-07-12 6 views
2

の行にある文字(a-zA-Z)の各4番目の文字を削除する方法を探しています。例えばJava - 行内の文字の4番目の文字を削除する

私は次の文字列がある場合、:
helloooo I am veeeeeeeeery busy right nowww because I am working veeeeeery hard

を私はすべての第四、第五、第六、...行の文字を削除します。しかし、hardという単語では、4番目のrが発生します。削除したくないのは、それが4番目のrではないからです。それは他の文字で囲まれています。結果は次のようになります。 hellooo I am veeery busy right nowww because I am working veeery hard

私はすでにこれを行う方法を探している、と私は文字の第4回発生を削除/交換する方法を発見した可能性がありますが、私は交換する方法を見つけることができませんでした/行の文字の4番目のオカレンスを削除します。

ありがとうございます。

+0

正規表現の回答が必要ですか?またはヘルパー機能が機能するでしょうか? –

+0

機能も機能すると思います。 – Priv

+0

効率的かつ高速でリソースを過度に消費しない限り、 – Priv

答えて

2

あなたは後方参照に基づいて、この交換を使用することができます。

str = str.replaceAll("(([a-zA-Z])\\2\\2)\\2+", "$1"); 

Code Demo

RegEx Demo

2

正規表現は((.)\2{2})\2*です。 Java-eseで何が分かっているのかはっきりしていませんが、その文字の任意の単一の文字と2つの追加のインスタンスに一致し、続いて任意の数の追加のインスタンスが続きます。その後、最初のキャプチャグループ(\1)の内容に置き換えてください。 Javaでは

+0

"aaaa" .replaceAll( "((。)\\ 1 {2})\\ 1 *"、 "" ) '' aaa "という結果を返すでしょうか? – Priv

+0

全くありません。私はJavaの正規表現のメカニックではありませんが、replaceAllの第2引数として2番目のキャプチャグループの内容(外側の括弧)が必要です。 –

+2

私はあなたが反対の順序でグループ番号を取り込んでいると思います。 –

3

機能は次のように書くことができる。

public static String transform(String input) { 
    if (input.isEmpty()) { 
     return input; 
    } else { 
     final StringBuilder sb = new StringBuilder(); 
     char lastChar = '\0'; 
     int duplicates = 0; 
     for (int i = 0; i < input.length(); i++) { 
      final char curChar = input.charAt(i); 
      if (curChar == lastChar) { 
       duplicates++; 
       if (duplicates < 3) { 
        sb.append(curChar); 
       } 
      } else { 
       sb.append(curChar); 
       lastChar = curChar; 
       duplicates = 0; 
      } 
     } 
     return sb.toString(); 
    } 
} 

私はそれが正規表現よりも速いと思う。

関連する問題