免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sunzhiguolu
打印 上一主题 下一主题

正则求助 [复制链接]

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
21 [报告]
发表于 2016-10-30 16:37 |只看该作者
你是不是想匹配取反?

  1. $str !~ /pattern/
复制代码

论坛徽章:
145
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
22 [报告]
发表于 2016-10-30 16:59 |只看该作者
本帖最后由 jason680 于 2016-10-30 17:01 编辑
sunzhiguolu 发表于 2016-10-30 16:21
这个问题难点在于如何确保整个字符串必须包含字母字符和数字字符两者.
观看字符串的结构才发现:
每种字符 ...


注:你写的,每一个都认识,可是这些字加到一起却不明白它的意思...---这也是你的主要问题

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
23 [报告]
发表于 2016-10-30 17:11 |只看该作者
回复 21# 104359176
大神 对于字母数字匹配的问题 我哪里没有描述清楚吗?

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
24 [报告]
发表于 2016-10-30 18:54 |只看该作者
本帖最后由 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』 能够匹配成功的话, 则找到一个匹配 引擎报告成功, 否则则失败.


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
25 [报告]
发表于 2016-10-30 19:01 |只看该作者
回复 21# 104359176
意思是否表达清楚, 请大神指正. (请大神手下留情)

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
26 [报告]
发表于 2016-10-31 16:27 |只看该作者
你说的是不是必须有字母和数字的混合?
  1. /(?:[a-z]+\d+)+|(?:\d+[a-z]+)+/
复制代码

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
27 [报告]
发表于 2016-10-31 16:33 |只看该作者
大部分情况下,用实例描述问题更具有说服力。

以下字符串不符合预期:
  1. 123
  2. abc
复制代码

以下字符串符合预期:
  1. 123abc
  2. abc123
复制代码

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很给力!

查看全部评分

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
28 [报告]
发表于 2016-10-31 17:20 |只看该作者
我估计你把问题搞复杂了,你对正则已经理解很深入了,已经具备自己写一个正则表达式解析器的能力。

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
29 [报告]
发表于 2016-10-31 18:29 |只看该作者
回复 27# 104359176
大神 的确我漏掉了一些可能性, 谢谢大神指点. 接下来我用2张图就能很好的说明:

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
30 [报告]
发表于 2016-10-31 18:30 |只看该作者
重点在这里:

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP