私がやろうとしてきたのは、繰り返される文字を小文字バージョンの文字に置き換えることです(Javaで)。例えば:
マップする関数が必要です:
bob -> bob
bOb -> bob
bOOb -> bob
bOob -> bob
boOb -> bob
bob -> bob
Bob -> Bob
bOb -> bob
ただし、正規表現 (Java) を使用してこれを行うことはできませんでした。
私は次のことを試しました:
String regex = "([A-za-z])\\1+";
String str ="bOob";
Pattern pattern = Pattern.compile(regex , Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.replaceAll("$1"));
ただし、これは bob ではなく bOb を返します。(boObで動作します)。
私も試しました:
Pattern pattern = Pattern.compile("(?i)([A-Za-z0-9])(?=\\1)", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
return matcher.replaceAll("");
これにより、1 つの問題が解決され、現在は bOob -> bob ですが、boOb を bob にマップするため、別の問題が発生します。
注: BOobOoboObOoObooOoOoOoOoOOb -> Bobobobobob もマップする必要があります。
この時点で、文字列をループして各文字に基づいていくつかのロジックを実行する方が簡単かもしれないと感じていますが、正規表現の使用をあきらめたくありませんでした...正規表現を使用したソリューションが存在する場合、それはもっとありますか?各文字をループするよりも効率的でしょうか?
前もって感謝します!
PS:文字列を渡す前にすべてを小文字にすることができることは承知していますが、それはマップされるため、私が望んでいたものではありません:
ボブ -> ボブ