我想知道String
是否只重复了一种类型的角色。
例如,我想检测一个String
是否仅由“b”组成,所以“bb”,“bbbb”,“bbbbbbbbbbb”,...
答案 0 :(得分:2)
正则表达式怎么样?
String pattern = "([a-zA-Z])\\1*";
if (string.matches(pattern)) {
// The string contains is made up of the same character...
}
答案 1 :(得分:1)
使用 Pattern
使用反向引用
的东西 boolean b = Pattern.matches("^(.)\\1+$", "aaaaaaa");
//true
b = Pattern.matches("^(.)\\1+$", "aaaabbbbaaa");
//false
如果您想匹配 1个字符字符串,请将正则表达式中的+
更改为*
。
答案 2 :(得分:0)
获取字符串的第一个位置并将其与剩余位置进行比较,如果它没有改变,则只有一种类型的字符串
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;
}
答案 3 :(得分:0)
String regex = "^" + str.charAt(0) + "+$"
return str.replaceAll(regex,"").length() == 0 ? true : false;
答案 4 :(得分:0)
private final static Pattern ONE_CHAR_PATTERN = Pattern.compile("(.)\\1*");
public static boolean isOneChar(String str) {
return ONE_CHAR_PATTERN.matcher(str).matches();
}
我想出了其他一些方法,但是使用正则表达式(如上所述)是我能想出的唯一一种能够正确处理unicode Basic Multilingual Plane之外的字符的方法,例如
System.err.println(isOneChar(""));
在处理BMP之外的字符时,您不能依赖字符串上的charAt或length来返回字符或字符数。
这是什么梦想崩溃&#39;答案可能看起来像是否正确处理了unicode:
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;
}
同样,并不是真的需要一直走过字符串,所以我认为这不像正则表达式解决方案那样有效。