我想知道 aString
是否仅由一种字符的重复组成。
例如,我想检测 aString
是否仅由“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 个字符的字符串,+
请将 Regex 中的 更改为*
.
获取字符串的第一个字符并将其与其余字符进行比较,如果它没有更改,则字符串只有一种类型的字符(此解决方案适用于非 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;
}
String regex = "^" + str.charAt(0) + "+$"
return str.replaceAll(regex,"").length() == 0 ? true : false;
private final static Pattern ONE_CHAR_PATTERN = Pattern.compile("(.)\\1*");
public static boolean isOneChar(String str) {
return ONE_CHAR_PATTERN.matcher(str).matches();
}
我想出了许多其他方法来做到这一点,但使用正则表达式(如上)是我能想出的唯一简单的方法,它可以正确处理 unicode 基本多语言平面之外的字符,例如
System.err.println(isOneChar(""));
在处理 BMP 之外的字符时,不能依赖字符串上的 charAt 或 length 来返回字符或字符数。
如果正确处理 unicode,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;
}
同样,实际上不需要一直遍历字符串,所以我认为这不如正则表达式解决方案有效。