java 判断每个字符串中指定字符的个数

该博客探讨了Java中String类的split()方法,通过示例代码展示了如何利用该函数将字符串按特定分隔符拆分成数组,并获取到包含分隔符的子串数量。内容涉及字符串处理的基本操作和数组长度的计算。

利用 String 的 split() 函数

示例

String str = "abcd#abcd#abcd#abcd#";
String[] split = str.split("#");
int len = split.length - 1;

这个 len 值就是包含的指定字符个数的值

<think>我们有一个需求:在Java判断字符串中包含的汉字数量。 根据引用资料,我们可以总结几种方法: 方法1(引用[2]和[3]):逐个字符判断,利用中文字符在UTF-8编码下占多个字节(通常2-4个字节,但一个字符Java内部是UTF-16编码,所以这里的方法并不准确,因为String.getBytes("UTF-8")可以获取字节数,但一个中文字符在UTF-8中通常占3个字节,而英文字符占1个字节。所以如果某个字符的UTF-8字节数大于1,则可以认为是中文字符(但注意,其他非中文字符也可能占多个字节,比如日文、韩文等,所以这个方法实际上是判断非ASCII字符,包括中文)。 方法2(引用[4]):将字符转换成二进制字符串,如果长度大于8,则说明是双字节字符(这里应该是针对Java的char类型,因为Java的char是16位,所以英文字符也是16位,但通常英文字符的Unicode码点小于128,其二进制表示可能不足16位,但转换为二进制字符串时,Integer.toBinaryString()会去掉前导零,所以英文字符的二进制字符串长度一般小于等于8,而中文字符的码点大于255,所以二进制字符串长度会大于8?)。但是,注意:Java的char是16位,所以一个char的二进制表示最多16位,所以大于8位并不代表就是中文字符,因为英文字符的Unicode码点也在0-127之间,二进制位数小于8(实际上7位就够了),但转换为二进制字符串时,如果高位有0,会被省略。所以如果一个字符的二进制字符串长度大于8,那么它至少需要9位以上,即码点值大于255(2^8-1=255),所以可以认为是非拉丁字符,包括中文。 但是,更准确的方法是使用正则表达式或者Unicode范围来判断。因为汉字在Unicode中有一个范围:通常是[\u4e00-\u9fa5](这个范围覆盖了大部分常用汉字,但还有一些扩展汉字不在这个范围内,比如𠀀(扩展A)等,如果需要更全面,可以包括扩展区)。 因此,我们可以采用以下方法: 方法3:使用正则表达式匹配每个字符是否在汉字的Unicode范围内。 我们选择方法3作为更准确的方法,同时也可以使用方法1或方法2作为参考,但方法1可能误判其他非中文字符,方法2实际上也是通过码点值判断(大于255的为非拉丁字符,但不一定是中文)。 具体步骤: 1. 遍历字符串中的每个字符。 2. 判断字符是否在汉字的Unicode范围内(例如:\u4e00-\u9fa5,或者还包括扩展区,比如\u3400-\u4DBF(扩展A)等,根据需求选择范围)。 3. 统计满足条件的字符个数。 但是,由于汉字Unicode范围有多个,我们这里使用常用范围[\u4E00-\u9FA5],以及全角中文标点等可能不包括在内,如果需求是只统计汉字(不包括标点),那么这个范围就够了。如果还需要包括中文标点,则需要另外添加范围。 根据需求,我们只统计汉字(即中文字符中的汉字部分),所以使用[\u4E00-\u9FA5]即可。 代码示例: 我们可以写一个方法,输入一个字符串,返回其中汉字的个数。 注意:Java中可以使用Character.UnicodeBlock来判断,但这里我们直接使用字符的Unicode码点范围。 实现: ```java public class ChineseCharacterCounter { public static void main(String[] args) { String str = "Hello, 你好!这是一段测试文本。"; int count = countChineseCharacters(str); System.out.println("字符串中汉字的个数为: " + count); } public static int countChineseCharacters(String str) { if (str == null || str.isEmpty()) { return 0; } int count = 0; for (char c : str.toCharArray()) { // 判断字符c是否在汉字的Unicode范围内(常用汉字范围:4E00-9FA5) if (c >= '\u4e00' && c <= '\u9fa5') { count++; } } return count; } } ``` 但是,上面的方法只考虑了常用汉字,如果字符串中包含生僻字(比如扩展A区的汉字),则不会被统计。如果需要更全面的统计,可以扩展范围,例如: - 扩展A区:\u3400-\u4DBF - 常用汉字:\u4E00-\u9FFF(这里比9FA5大一些,包括了9FA5之后的少量汉字) - 扩展B区:\u20000-\u2A6DF(注意:这些字符Java中是用两个char表示的,即代理对(surrogate pair)) 因此,如果字符串中可能包含扩展B区及之后的汉字(即Unicode码点大于0xFFFF的字符),那么我们需要使用码点(code point)来遍历字符串,而不是使用char(因为char只能表示0~FFFF的字符)。 修改后的方法(支持辅助平面字符): ```java public static int countChineseCharacters(String str) { if (str == null || str.isEmpty()) { return 0; } int count = 0; // 使用码点遍历 for (int i = 0; i < str.length(); ) { int codePoint = str.codePointAt(i); // 判断该码点是否在汉字范围内 if (isChineseCodePoint(codePoint)) { count++; } // 根据码点所占的字符长度移动索引 i += Character.charCount(codePoint); } return count; } private static boolean isChineseCodePoint(int codePoint) { // 常用汉字范围(4E00-9FFF) if (codePoint >= 0x4E00 && codePoint <= 0x9FFF) { return true; } // 扩展A区(3400-4DBF) if (codePoint >= 0x3400 && codePoint <= 0x4DBF) { return true; } // 扩展B区(20000-2A6DF) if (codePoint >= 0x20000 && codePoint <= 0x2A6DF) { return true; } // 扩展C区(2A700–2B73F)和扩展D区(2B740–2B81F)等,根据需要添加 // 这里只列了部分,实际可以根据需求扩展 return false; } ``` 注意:上面的扩展区范围很大,实际应用中根据需求选择。如果只需要常用汉字,使用第一个范围即可。 另外,引用[2]中提供了一个方法:通过UTF-8编码的字节数判断,但这种方法会误判其他非中文字符(比如日文、韩文等),如果需求是只统计中文,那么这种方法不准确。 引用[4]的方法:将字符转换为二进制字符串判断长度是否大于8。实际上,它判断的是字符的Unicode码点是否大于255(因为一个字节8位,大于255的字符需要超过8位来表示)。但这种方法同样会把非中文的其他非ASCII字符(如日文、希腊字母等)统计进来。 因此,我们推荐使用Unicode范围的方法,准确统计汉字。 相关问题: 1. 如何判断一个字符是否是中文汉字(包括生僻字)? 2. 在Java中,如何处理包含代理对的字符串(即辅助平面字符)? 3. 除了汉字,如何统计字符串中中文字符(包括标点符号)的数量? 4. 如何优化统计大量文本中汉字数量的性能?</think>### Java 判断字符串中汉字个数的实现方法 在 Java判断字符串包含的汉字数量,可以通过以下几种方法实现: #### 方法 1:Unicode 范围判断(推荐) ```java public static int countChineseCharacters(String str) { if (str == null || str.isEmpty()) return 0; int count = 0; for (char c : str.toCharArray()) { // 汉字 Unicode 范围:\u4E00-\u9FA5(基本汉字)和 \uF900-\uFAFF(扩展汉字) if ((c >= '\u4E00' && c <= '\u9FA5') || (c >= '\uF900' && c <= '\uFAFF')) { count++; } } return count; } ``` **原理**: 汉字在 Unicode 中分布在特定区间(4E00-9FA5 和 F900-FAFF),直接检查字符是否落在此区间即可[^3]。 #### 方法 2:字节长度差异法 ```java public static int countChineseByBytes(String str) { if (str == null) return 0; int count = 0; try { for (char c : str.toCharArray()) { // UTF-8 编码下汉字占 3 字节,ASCII 占 1 字节 if (String.valueOf(c).getBytes("UTF-8").length > 1) { count++; } } } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return count; } ``` **注意**:此方法会误判其他非 ASCII 字符(如日文、韩文)[^2]。 #### 方法 3:正则表达式匹配 ```java public static int countChineseByRegex(String str) { if (str == null) return 0; // 匹配所有汉字(Unicode 范围) String regex = "[\\u4E00-\\u9FA5\\uF900-\\uFAFF]"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(str); int count = 0; while (matcher.find()) { count++; } return count; } ``` ### 使用示例 ```java public static void main(String[] args) { String text = "Hello, 世界!Java编程 2024"; System.out.println("Unicode 方法: " + countChineseCharacters(text)); // 输出 4 System.out.println("字节长度方法: " + countChineseByBytes(text)); // 输出 4 System.out.println("正则表达式方法: " + countChineseByRegex(text)); // 输出 4 } ``` ### 注意事项 1. **扩展汉字支持**: 如需包含生僻字(如𠀀),需扩展 Unicode 范围(如 `\u3400-\u4DBF` 扩展 A 区)[^3]。 2. **代理对处理**: 对于 Unicode 辅助平面字符(如𩸽),需使用 `codePointAt()` 而非 `charAt()`。 3. **性能建议**: Unicode 范围判断性能最优,正则表达式适合复杂匹配但效率较低[^4]。 > 示例输出:字符串 `"Hello, 世界!Java编程 2024"` 包含 4 个汉字("世"、"界"、"编"、"程")。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值