JavaScript高级正则:按三类字符分组统计数量
解决字符分组统计的正则方案
嘿,我明白你卡在正则转义和分组统计的地方了——这事儿确实容易在特殊字符上踩坑,尤其是字符集([])里的规则特别容易搞混。咱们一步步拆解,搞定这个问题:
先理清正则字符集的核心规则
在正则的字符集[]里,大部分特殊字符不需要转义,但有几个例外必须注意:
-:如果放在字符集中间会被当成范围运算符(比如a-z),所以要么转义\-,要么把它放在字符集的开头或末尾;^:放在字符集开头是取反标记,如果要把它当成普通字符,要么转义\^,要么放在非开头位置;[和]:必须转义\[和\],否则会被当成字符集的起止边界;- 其他字符(比如
|、{}、~)在字符集里都是普通字符,转义不转义都可以,但转义后可读性更强,避免和正则的其他语法混淆。
针对三类字符的正则编写
第一类字符正则
把你列出的所有字符、空格、换行(\n)、回车(\r)放进字符集,注意把-放在末尾避免解析成范围:
[a-zA-Z0-9@¡¿£_!$"¥#è¤é%ù&ìYò(Ç)*:Ø+;øÆ,<æß.>É/?ÄäÖöÑñÜü§à \n\r-]
第二类字符正则
针对|^{}[]~€这些字符,需要转义[、]和^(避免取反),|也可以转义增强可读性:
[\|^\{\}\[\]~€]
第三类字符正则
直接对前两类的所有字符取反即可(注意把前两类的字符整合到一个字符集里,前面加^):
[^a-zA-Z0-9@¡¿£_!$"¥#è¤é%ù&ìYò(Ç)*:Ø+;øÆ,<æß.>É/?ÄäÖöÑñÜü§à \n\r-\|^\{\}\[\]~€]
代码实现示例(Python)
这里用两种方式实现统计,你可以选适合自己的:
方式1:用findall批量匹配
import re # 替换成你的目标字符串 target_text = "Hello! @World | {} [] ~€ 测试字符 123" # 定义三类正则模式 pattern_group1 = r'[a-zA-Z0-9@¡¿£_!$"¥#è¤é%ù&ìYò(Ç)*:Ø+;øÆ,<æß.>É/?ÄäÖöÑñÜü§à \n\r-]' pattern_group2 = r'[\|^\{\}\[\]~€]' pattern_group3 = r'[^a-zA-Z0-9@¡¿£_!$"¥#è¤é%ù&ìYò(Ç)*:Ø+;øÆ,<æß.>É/?ÄäÖöÑñÜü§à \n\r-\|^\{\}\[\]~€]' # 统计每类字符数量 count1 = len(re.findall(pattern_group1, target_text)) count2 = len(re.findall(pattern_group2, target_text)) count3 = len(re.findall(pattern_group3, target_text)) print(f"第一类字符数:{count1}") print(f"第二类字符数:{count2}") print(f"第三类字符数:{count3}")
方式2:遍历字符逐个匹配(效率更高)
如果字符串很长,遍历逐个判断的性能会更好:
import re target_text = "Hello! @World | {} [] ~€ 测试字符 123" # 预编译正则,提升匹配效率 group1_re = re.compile(r'[a-zA-Z0-9@¡¿£_!$"¥#è¤é%ù&ìYò(Ç)*:Ø+;øÆ,<æß.>É/?ÄäÖöÑñÜü§à \n\r-]') group2_re = re.compile(r'[\|^\{\}\[\]~€]') count1 = count2 = count3 = 0 for char in target_text: if group1_re.match(char): count1 += 1 elif group2_re.match(char): count2 += 1 else: count3 += 1 print(f"第一类:{count1},第二类:{count2},第三类:{count3}")
额外提醒
- 如果用其他语言(比如JavaScript、Java),正则语法略有差异:比如Java里需要双重转义(
\\代替\); - 确保代码文件保存为UTF-8编码,避免特殊字符(比如
¡、¿)乱码; - 可以用正则测试工具输入测试字符串,验证你的正则是否匹配正确,快速排查问题。
内容的提问来源于stack exchange,提问作者Nuno Cabrinha
相关产品推荐
相关产品推荐

