4

我想知道 aString是否仅由一种字符的重复组成。

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

4

5 回答 5

3

正则表达式怎么样?

String pattern = "([a-zA-Z])\\1*";

if (string.matches(pattern)) {
    // The string contains is made up of the same character...

}
于 2012-10-31T22:37:07.103 回答
2

使用模式

使用反向引用的东西

 boolean b = Pattern.matches("^(.)\\1+$", "aaaaaaa");
 //true

 b = Pattern.matches("^(.)\\1+$", "aaaabbbbaaa");
 //false

如果您还想匹配1 个字符的字符串,+请将 Regex 中的 更改为*.

于 2012-10-31T22:37:17.620 回答
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;
}
于 2012-10-31T22:31:58.867 回答
0
String regex = "^" + str.charAt(0) + "+$"
return str.replaceAll(regex,"").length() == 0 ? true : false;
于 2012-10-31T22:38:38.660 回答
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 基本多语言平面之外的字符,例如

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

同样,实际上不需要一直遍历字符串,所以我认为这不如正则表达式解决方案有效。

于 2012-10-31T22:56:40.093 回答