正则表达式实例分析(转)

原创 2007年09月19日 10:26:00

正则表达式问题:

-0113--0-310-1
-1101-1-10--00
10-1--1--30000
3--3110-00-1-3
301--10-1-00-1

条件1: 长度为14个字符
条件2: 其中任意9个位置为数字,并且数字只能是(0,1,3)
条件3: 其余的位置全部为"-"符号

------------------------------------------ 求一个正则表达式

首先是正则问题的需求:
1、目的
2、规律或规则
3、应用环境

当我看到一个正则问题的时候,我希望看到的是一个以上三点都明确的问题
目的:希望用正则来做什么?验证规则,提取,替换,分割等等。
规律或规则:符合什么样的规律,或者是应遵守什么样的规则。
应用环境:正则用于.NET程序中,还是验证控件或javascript中。
另外就是一些细节的描述,比如提取是提取一条,还是同时提取多条等等。这方面当然是越详细越好,有利于回复者与提问者的沟通,也有利于问题的尽快解决。


接下来谈一谈楼主这个问题
首先,可以看出这需要的是一个验证规则的正则表达式。所以通常情况下,前面的“^”和后面的“$”是必不可少的。
接着是内容,字符固定(0、1、3、-)之一,位数固定,14位,那么基本的正则可以写出
^[013-]{14}$

现在还剩下两个需求:9个数字,5个-,但位置不固定。

还有一点是楼主没有明确的,就是应用环境,如果是在.NET程序中,尽可以用各种方法来实现,甚至走一个极端,用穷举法列出各种可能,然后用“|”或的关系组成一个正则,但那仅仅是一个极端而已,不通用,也无扩展性可言,再就是如果位数多一些,会累死的^o^

既然不能一一列举可能性,就要把它作为条件来写这个正则,可以用作条件的,就是正反向预搜索了
(?<=Exp)、(?<!Exp)、(?=Exp)、(?!Exp)

考虑到通用性和扩展性,放弃使用前三个,以上四个,.NET都支持,但是前两个js中不支持,第三个js虽然支持,但是并不稳定,所以弃用。

那么现在就只是使用(?!Exp)做为条件了,思路确定,接下来是实现,至于(?!Exp)的详细说明,参考一下相关教程吧,这里不做说明
(?!(.*?-){6,})
(?!(.*?/d){10,})
前一个限制“-”字符不能超过5个,后一个限制数字不能超过10个,再加上后面的{14}把字符数限制在14位,三个条件加起来,那就是9个数字,5个-,总数为14个^o^

分析过程是正向思维,最后的实现可以算是逆向思维,至于怎么想到,呵呵,或许可以算做是一点经验吧。
 (lxcnn(过客) (超级大菜鸟,昨天才上路)所写)

正则表达式转DFA

陈梓瀚 vczh@163.com http://www.cppblog.com/vczh/ 1、问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词法分析独...
  • class_brick
  • class_brick
  • 2017年10月13日 16:52
  • 686

实例分析神经网络传播过程

神经网络简介 博客主要内容 神经网络框架 神经网络前向传播实例 神经网络反向传播实例 总结 引用 一.神经网络简介今天,神经网络(nerual networks)已经是一个相当大的、多学科交叉的学科领...
  • u013139259
  • u013139259
  • 2016年11月01日 23:03
  • 581

数字转换成汉语中人民币的大写(javascript正则)

数字转换成汉语中人民币的大写(javascript正则)
  • qq_15266291
  • qq_15266291
  • 2017年01月22日 22:53
  • 366

正则表达式转NFA

前面一节介绍了NFA,这里讲介绍如何将正则表达式转化为等价的NFA。 1. 正则表达式的基本运算 正则表达式有三种基本的运算: 1) 连接(Concatenation), 例如 abc, 由a, b,...
  • xxc1605629895
  • xxc1605629895
  • 2014年03月25日 19:58
  • 5577

正则表达式DFA构造方法

陈梓瀚 vczh@163.com http://www.cppblog.com/vczh/ 1、问题概述 随着计算机语言的结构越来越复杂,为了开发优秀的编译器,人们已经渐渐感到将词法分析独...
  • Chinamming
  • Chinamming
  • 2013年12月06日 14:15
  • 11722

perl正则表达式实现大写字母转小写字母

这个功能不难,但是要求必须用s///的形式,而且后面不能加第三个参数,不能是s///g这样的形式。不过可以采用多个这样的表达式。例如 s/A/a/s/B/b/s/AB/ab/................
  • thisisvoa
  • thisisvoa
  • 2011年06月14日 20:03
  • 2135

正则表达式(编译原理)

《编译原理》第三章习题 我们的教材是那本经典的“龙书”:《Compiler: Principles, Techniques, and Tools》 灰常灰常喜欢小监老师的课,就...
  • qq_18395603
  • qq_18395603
  • 2016年06月13日 10:33
  • 1123

批处理FINDSTR正则表达式用法实例分析

dos 批处理中findstr的使用
  • lebsharing
  • lebsharing
  • 2017年03月24日 14:57
  • 131

RPC原理及RPC实例分析(下)

3.3 客户端是怎样获取服务端的返回数据的? 下面贴出Client.Connection类和Client.Call类中的相关方法: 方法一: public void run() {...
  • a494303877
  • a494303877
  • 2016年11月11日 10:01
  • 647

android实例分析(转)

http://www.cnblogs.com/phinecos/archive/2009/08/29/1556534.html
  • bmj
  • bmj
  • 2012年06月01日 15:50
  • 456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:正则表达式实例分析(转)
举报原因:
原因补充:

(最多只允许输入30个字)