3

重複した文字をすべて削除するために Java で動作する Regex サンプルは好きではありません。

このコードはうまく機能しません: 'g' と '<' は削除され、2 つ以上の文字は明確に 1 つに削減されず、'454' は '5' に削減されます。

s = "aa  hgjii2222 22    FFonn;;;,,1111111111 22< 454";
p = Pattern.compile("(.)(.)");
m = p.matcher(s);
System.out.println(m.replaceAll("$1") );

出力:

a hji222 Fon;,11111 2 5

私はあまり成功していない他のソリューションを試しました。

4

3 に答える 3

5

できるよ:

String s= "aa  hgjii2222 22    FFonn;;;,,1111111111 22< 454";
s = s.replaceAll("(.)\\1+","$1");

使用される正規表現は次のとおりです。(.)\\1+

(.)  - Matches any non-newline character and remembers it
\\1+ - One or more repetitions of the remembered character
于 2012-07-02T10:46:34.247 に答える
2

使用する

"(.)\\1+"

代わりは。

最初の記号は1回以上繰り返されます。

于 2012-07-02T10:46:35.770 に答える
0

そのパターンはあなたが望むことをまったくしません。

任意の文字を検索し、その後に任意の文字(必ずしも最初の文字と同じである必要はありません)を検索し、この2文字の文字列を最初の一致(最初の文字)に置き換えます。

つまり、1文字おきに削除されます。

正規表現があなたが探している仕事に適したツールだとは思いません。これをFSAとしてどのように実装できるかを考えてください。正規言語では、問題がまったく説明されていないことは明らかです。

これをコードで単純に行う方がはるかに簡単で、ほぼ間違いなく明確です。これまでに遭遇したすべての文字のセットを保持し、反復するときに一致する文字をすべて削除します-次のようになります。

final Set<Character> charsSeen = new HashSet<Character>();
final StringBuilder out = new StringBuilder();
for (char c : s.toCharArray()) {
    if (!charsSeen.contains(c)) {
        out.append(c);
        charsSeen.add(c);
    }
}
return out.toString();
于 2012-07-02T10:46:43.573 に答える