private static final Pattern PHONE_NUMBER_REG_EXP = Pattern.compile("[零一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾0-90123456789]+"); 这个正则解释一下?
这个正则表达式 Pattern.compile("[零一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾0-90123456789]+") 用于匹配一个由中文字符数字(简体、繁体)和阿拉伯数字(半角、全角)组成的连续字符串。它的核心作用是识别包含数字字符的序列,但不验证其是否符合实际的电话号码格式。
以下是详细分解:
-
结构分析:
[ ... ]: 这是一个字符类。它定义了一组允许匹配的字符。+: 这是一个量词。它表示前面的字符类(即方括号内的所有字符)必须出现一次或多次。因此,它匹配的是一个或多个连续的、属于该字符类中定义的字符组成的字符串。
-
字符类内容详解: 字符类
[零一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾0-90123456789]包含了以下四类字符:- 简体中文数字:
零、一、二、三、四、五、六、七、八、九、十 - 繁体中文数字(大写,常用于金融等场合):
壹、贰、叁、肆、伍、陆、柒、捌、玖、拾 - 半角阿拉伯数字(标准ASCII数字):
0、1、2、3、4、5、6、7、8、9(由0-9表示范围) - 全角阿拉伯数字(全角字符中的数字):
0、1、2、3、4、5、6、7、8、9(由0-9表示范围)
- 简体中文数字:
-
功能总结:
- 这个正则表达式会匹配任何只包含上述列出的简体中文数字、繁体中文数字、半角阿拉伯数字和全角阿拉伯数字的连续字符串。
- 例如,以下字符串都会被匹配:
13800138000(纯半角数字)13800138000(纯全角数字)一三八零零一三八零零零(纯简体中文数字)壹叁捌零零壹叁捌零零零(纯繁体中文数字)电话:138零零壹叁八零零零(混合了半角数字、简体中文、繁体中文 - 注意:这里包含了非数字字符电话:,所以整个字符串不会被匹配。只有连续的数字字符部分会被匹配)一二三四五六七八九零(简体)壹贰叁肆伍陆柒捌玖零(繁体)
-
作为电话号码匹配的局限性:
- 格式验证缺失: 这个正则只关心字符类型,完全不关心电话号码的结构(如长度、区号格式、分隔符
-、空格、+等)。一个由 20 个一组成的字符串也会被匹配,但这显然不是有效的电话号码。 - 包含非电话号码字符: 它匹配了中文数字
十和拾,这两个字符在标准的电话号码表示中几乎不会出现(电话号码是数字序列,不会用十表示 10)。 - 缺少必要字符: 实际电话号码中常见的符号如
+(国际前缀)、-、(,), 空格等不被包含在这个字符类中。因此,包含这些符号的合法电话号码(如+86-10-12345678或(010)87654321)不会被这个正则表达式完整匹配(只能匹配其中连续的数字部分)。 - 过于宽松: 它允许任意组合和长度的数字字符序列,导致很多非电话号码的字符串(如商品编号、身份证号片段、纯数字文本等)也会被匹配。
- 格式验证缺失: 这个正则只关心字符类型,完全不关心电话号码的结构(如长度、区号格式、分隔符
结论:
这个正则表达式 PHONE_NUMBER_REG_EXP 更适合命名为 DIGIT_SEQUENCE_REG_EXP 或类似名称,因为它本质上是用来识别包含特定数字字符(中文和阿拉伯)的连续序列。它不是一个有效的电话号码验证正则表达式。如果需要验证电话号码格式,需要设计更复杂的正则表达式,考虑国家/地区代码、区号、分隔符、长度限制等规则,并且通常应排除中文数字(除非有特定需求)。
[]在正则里是什么?
在正则表达式中,方括号 [] 表示一个字符类(Character Class),用于定义一组允许匹配的字符。以下是关键点解析:
核心功能
匹配 方括号内任意一个字符(不是整个字符串)。
例如:[abc] 表示匹配单个字符 a、b 或 c。
特殊规则
-
范围简写
- 用连字符
-表示连续范围:
[0-9]➜ 匹配所有数字(等价于\d)
[a-z]➜ 匹配小写字母
[A-Za-z]➜ 匹配所有字母
- 用连字符
-
排除字符
在开头使用^表示不匹配这些字符:
[^0-9]➜ 匹配非数字的任意字符(等价于\D) -
特殊字符转义
在字符类中,大多数特殊字符(如.、*、+)会失去特殊含义,但需注意:]、-、^、\在字符类中有特殊含义,需用反斜杠转义:
[\^\-\]]➜ 匹配字面字符^、-或]
在您提供的正则中的用法
[零一二三四五六七八九十壹贰叁肆伍陆柒捌玖拾0-90123456789]
- 含义:匹配以下任意字符:
- 简体中文数字:
零、一、二...十 - 繁体中文数字:
壹、贰...拾 - 半角阿拉伯数字:
0-9 - 全角阿拉伯数字:
0-9
- 简体中文数字:
- 作用:识别连续的数字字符(无论语言或全/半角),但不验证格式。
示例
- 匹配成功:
"13800"、"一二三"、"100" - 匹配失败:
"abc"(不含指定字符)、"电话"(不含指定字符)
与其他符号的区别
| 符号 | 含义 | 示例 |
|---|---|---|
[] |
匹配一个指定字符 | [ab] ➜ a 或 b |
() |
分组或捕获子表达式 | (ab)+ ➜ abab |
{} |
指定重复次数 | a{3} ➜ aaa |
. |
匹配任意单个字符 | a.c ➜ abc、axc |
总结
[] 用于声明 “或”关系的字符集合,是正则中匹配单字符灵活性的核心工具。在您的正则中,它用于兼容多种数字表示形式,但需注意它不验证整体格式(如电话号码长度/结构)。