0

行に削除する必要のある文字列が含まれているかどうかを確認し、どの記号を削除するかを示す必要があります。
同じ記号の連続する文字が3つ以上ある場合は、文字シーケンスはアンダースコア( " ")に置き換えられ、シーケンスの長さに応じて置き換えられます。たとえば、「、_、@、@、@、@、$、$ 、、#、#、!」という行 「 、_、_、_、_、_、_、$、$、_、#、#、!」に変換されます 除去のプロセスの後。
これは、StringまたはStringBuilder、Regexなどでのみ行う必要があります...(Javaの基本的なコーディングのみ)。
配列も使用できません。前もって感謝します。
これは私が試したものです:

public static void main(String[] args) {    
    String linha = "##,$$$$,%%%%,@%@@@,!!!!", validos = "$#%!@";        
        for (int i = 0; i < validos.length(); i++) {
            linha = linha.replaceAll("\\" + validos.charAt(i) + "{3,}", "_");
        }
        System.out.println (linha);
    }
}

ここでの問題は、シーケンスを1つの「_」だけに置き換えることです。どの文字が置き換えられるかわかりません。

4

4 に答える 4

0

一度に3つの文字を置き換えようとしていて、代わりに3つのアンダースコアが必要な場合は、次のことを見逃しているだけです。

linha = linha.replaceAll("\\" + validos.charAt(i) + "{3,}", "___");

カンマで区切る場合:

linha = linha.replaceAll("\\" + validos.charAt(i) + "{3,}", "_,_,_");
于 2012-11-06T03:06:10.880 に答える
0

これは実際には実装されていませんが、これはあなたが見るかもしれないものです:

マッチャーには、がありfind(int start)start()end()

「3つ以上の繰り返し文字」のパターンを用意します(質問のコメントを参照できます)。

psuedoコードは次のようなものです。

int lastEndingPosition = 0;
StringBuilder sb;

while (matcher can find next group) {
  // add the unmatched part
  sb.append( substring of input string from lastEndingPosition to matcher.start() ); 

  // add the matched part
  sb.append( "-" for matcher.end() - matcher.start() times);
  lastEndingPosition = matcher.end();
}
sb.append( substring of input string from lastEndingPosition to the end);

おそらく、これを行うためのよりエレガントな方法がいくつかあります。これは1つの選択肢にすぎません

于 2012-11-06T04:07:59.667 に答える
0

確かにあなたはこれを多くの方法で行うことができます、そしておそらくこれはあなた自身で行うのに良い運動です。ここでは、基本的なループ構造だけを使用した基本的な実装があり、StringUtilsライブラリのような派手なものはありません...以前のループ実装では、の異なる場所で繰り返される同じ文字の複数のオカレンスを見逃していたことに注意してくださいlinha

static int index(String lookInStr, char lookUpChr) {
    return lookInStr.indexOf(new String(new char[] { lookUpChr, lookUpChr, lookUpChr }));
}

public static void main(String[] args) {
    String linha = "####,@@@@@@@@,$$$$,%%%%,@%@@@,!!!!", validos = "$#%!@";
    for (int i = 0; i < validos.length(); i++) {
        char currentSearchChar = validos.charAt(i);
        do {
            int index = index(linha, currentSearchChar);
            if (index >= 0) {
                int count = -1;
                do {
                    count++;
                } while (linha.charAt(count + index) == currentSearchChar && count + index < linha.length() - 1);
                String replacementSeq = "";
                for (int j = 0; j < count; j++) {
                    replacementSeq += "-";
                }
                linha = linha.replaceAll("\\" + validos.charAt(i) + "{" + count + ",}", replacementSeq);
            }
        } while (index(linha, currentSearchChar) >= 0);
    }
    System.out.println(linha);
}
于 2012-11-06T04:18:23.740 に答える
0

基本的に、これは文字列を別々のブロックに分割し、ブロックの長さをチェックして元のブロックを返すか、アンダースコアに置き換えます。

static String convert(String s) {
    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        StringBuilder tempSb = new StringBuilder();

        for(; i < s.length(); i++) {
            char d = s.charAt(i);

            if(d != c) {
                i--;
                break;
            } else {
                tempSb.append(d);
            }
        }

        String t = tempSb.toString();
        if(t.length() < 3) {
            sb.append(t);
        } else {
            sb.append(repeat("_", t.length()));
        }
    }

    return sb.toString();
}

public static void main(String[] args) {
    String x = convert("##,$$$$,%%%%,@%@@@,!!!!");
    System.out.println(x); // ##,____,____,@%___,____
}

そして、これが簡単な繰り返し方法です:

static String repeat(String s, int repeatCount) {
    StringBuilder sb = new StringBuilder();

    for(int i = 0; i < repeatCount; i++) {
        sb.append(s);
    }

    return sb.toString();
}
于 2012-11-06T04:41:07.313 に答える