检测String是否仅由一种字符组成

时间:2012-10-31 22:29:26

标签: java string character

我想知道String是否只重复了一种类型的角色。

例如,我想检测一个String是否仅由“b”组成,所以“bb”,“bbbb”,“bbbbbbbbbbb”,...

5 个答案:

答案 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;
}   

同样,并不是真的需要一直走过字符串,所以我认为这不像正则表达式解决方案那样有效。