- 论坛徽章:
- 307
|
本帖最后由 sunzhiguolu 于 2016-10-30 19:11 编辑
再来!
这个问题难点在于如何确保整个字符串必须包含字母字符和数字字符两者.
如下面的字符串:
123
abc
1ab3
a2bb
共分为3种情况: 全部由数字组成的字符串, 全部由字母组成的字符串, 全部由字母数字组成的字符串.
表达式:
\A(\d+[a-zA-Z]+(\d+|[a-zA-Z]+)*|[a-zA-Z]+\d+(\d+|[a-zA-Z]+)*)\Z
分解后, 由三部分组成: (为了划定表达式的范围, 我将表达式包含在 『』 符号之中)
1.> 『\A』#模式 1
2.> 『(\d+[a-zA-Z]+(\d+|[a-zA-Z]+)*|[a-zA-Z]+\d+(\d+|[a-zA-Z]+)*)』#模式 2, 注意:分组的背景色
3.> 『\Z』#模式 3
2.> 被包含在一个分组中 在该分组中的表达式又被多选结构操作符 『|』分为两部分:
2.1> 『\d+[a-zA-Z]+(\d+|[a-zA-Z]+)*』 #模式 2.1
2.2> 『[a-zA-Z]+\d+(\d+|[a-zA-Z]+)*』 #模式 2.2
对于字符串 123 来说:
正则引擎用模式 1 『\A』 从字符串的开始位置开始匹配, 匹配成功;
接着引擎进入分组; 并将控制权转交给模式 2.1, 表达式『\d+』会吃掉整个字符串 123 直到遇到字符串的结束位置才停止匹配 此次匹配成功
接着引擎将控制权交给表达式 『[a-zA-Z]+』, 『[a-zA-Z]+』来匹配字符串的结束位置 由于 '+' 量词要求至少满足一次匹配才能成功, 表达式 『[a-zA-Z]+』 匹配失败;
为了匹配成功, 引擎查看是否有备用状态可供回溯 表达式 『\d+』 在字符串 1ˆ2ˆ3 的每个位置都保留了一个备用状态.
为了匹配成功 表达式 『\d+』会释放一个字符 3 交由表达式『[a-zA-Z]+』 进行匹配, 此次匹配失败; 为了能够成功的匹配引擎继续要求表达式 『\d+』 释放一个字符 2 此次匹配依然失败,
此时引擎发现已经没有备用状态可供回溯 只能将控制权交由模式 2.2 进行匹配 (注意:模式 2.1 与 模式 2.2 处于同一个分组当中), 显然表达式 『[a-zA-Z]+』 无法完成此次匹配任务; 且引擎将所有可用的备用状态用尽依然无法匹配只能宣告此次匹配失败;
接着引擎想前推进一个字符, 从字符1之后2之前的位置开始匹配 结果无法满足模式 1 的匹配条件而失败, 直至遍历字符串中的每一个位置 依然没有匹配模式 1, 最终宣告失败.
对于字符串 abc 来说: 情形与上面相似, 不再复述.
对于字符串 1ab3 或者 a2bb 来说:
两者之间的区别在于, 一个以数字字符开始而另一个以字母字符开始
两者的相同点在于无论字符串是以数字字符开始 『\d+』 后面的表达式 『[a-zA-Z]+』都能满足匹配要求;
还是字符串是以字母字符开始 『[a-zA-Z]+』后面的表达式 『\d+』 都能满足匹配要求;
一旦前面的表达式成功匹配, 后面由 '*' 量词修饰的分组 (\d+|[a-zA-Z]+)* 若匹配成功, 且引擎退出分组后 模式 3 『\Z』 能够匹配成功的话, 则找到一个匹配 引擎报告成功, 否则则失败.
|
|