String
aが 1 種類の文字だけの繰り返しでできているかどうかを知りたいです。
たとえば、String
a が "b" のみで構成されているかどうかを検出したいので、"bb"、"bbbb"、"bbbbbbbbbbb" などの場合に当てはまります。
正規表現はどうですか?
String pattern = "([a-zA-Z])\\1*";
if (string.matches(pattern)) {
// The string contains is made up of the same character...
}
パターンの使用
後方参照を使用するもの
boolean b = Pattern.matches("^(.)\\1+$", "aaaaaaa");
//true
b = Pattern.matches("^(.)\\1+$", "aaaabbbbaaa");
//false
1 文字の文字列にも一致させたい場合+
は、正規表現の を*
.
文字列の最初の文字を取得し、それを残りの文字と比較します。文字列に含まれる文字の種類が 1 つしかない場合は、変更されません (このソリューションは非 BMP Unicode で機能します)。
public boolean sameCaracterInString(String string){
if(string == null || string.isEmpty())
return false;
for(int i = 1; i < string.length(); i++)
if(string.charAt(i) != string.charAt(0))
return false;
return true;
}
private final static Pattern ONE_CHAR_PATTERN = Pattern.compile("(.)\\1*");
public static boolean isOneChar(String str) {
return ONE_CHAR_PATTERN.matcher(str).matches();
}
私はこれを行う他のいくつかの方法を思いついたが、正規表現(上記のように)を使用することは、ユニコード基本多言語面の外側の文字を正しく処理するために私が思いつくことができる唯一の簡単な方法です。
System.err.println(isOneChar(""));
BMPの外部の文字を処理する場合、文字または文字数を返すために文字列のcharAtまたはlengthに依存することはできません。
ユニコードを正しく処理した場合、dreamcrashesの答えは次のようになります。
public static boolean isOneChar(String string) {
if(string == null || string.isEmpty()) return false; // probably, could also make an argument for empty being true.
int startCodePoint = Character.codePointAt(string, 0);
int length = string.length();
int position = Character.charCount(startCodePoint);
while (position < length) {
int thisCodePoint = Character.codePointAt(string, position);
if (thisCodePoint != startCodePoint) return false;
position += Character.charCount(thisCodePoint);
}
return true;
}
Satyajitによって提案された代替案に基づく別の可能性は次のとおりです。
public static boolean isOneChar(String string) {
String firstCharacter = string.substring(0, string.offsetByCodePoints(0, 1));
return string.replaceAll(Pattern.quote(firstCharacter), "").length() == 0;
}
これは非効率的だと思いますが(交換を行っているため)、実際にパフォーマンステストを行っていません...
StringTokenizerはUnicode文字を正しく処理するため、次のようなこともできます。
public static boolean isOneChar(String string) {
String firstChar = string.substring(0, string.offsetByCodePoints(0, 1));
return new StringTokenizer(string, firstChar).countTokens() == 0;
}
繰り返しになりますが、文字列全体を調べる必要は実際にはないので、これは正規表現ソリューションほど効率的ではないと思います。
String regex = "^" + str.charAt(0) + "+$"
return str.replaceAll(regex,"").length() == 0 ? true : false;