前些天朋友给了我一个非常有意思的问题,他限制一个输入项必须至少包含一个或一个以上的特殊字符,就问题本身并没有什么实用性,不过还是给出了他答案,下面是我的分析思路。
第一步分析需求
基本要求:输入项要求内容必须为大小写字母加特殊字符组成,长度2-15个字符;
特殊要求:输入项中至少包含一个或一个以上的特殊字符。
第二步着手分析
首先满足基本需求很简单,他的输入项内容只能包含大小写字母和特殊字符,那它的表达式由为[a-zaA-z~!@#$%^&*()_+|],限制长度在5-15个字符之间那就是[a-zaA-z~!@#$%^&*()_+|]{2,15},基本需求就已经满足。很简单哈。
接着考虑其特殊要求,输入项中至少包含一个或一个以上的特殊字符,现在我们可以肯定的是其输入特殊字符串的位置不能确定,在这里我们就得要考虑正则式的正反向预编译来处理了。
下面是一些基本概念,具体的需要大家去查询资料了。
正向预搜索:"(?=xxxxx)","(?!xxxxx)"
格式:"(?=xxxxx)",在被匹配的字符串中,它对所处的 "缝隙" 或者 "两头" 附加的条件是:所在缝隙的右侧,必须能够匹配上 xxxxx 这部分的表达式。因为它只是在此作为这个缝隙上附加的条件,所以它并不影响后边的表达式去真正匹配这个缝隙之后的字符。这就类似 "\b",本身不匹配任何字符。"\b" 只是将所在缝隙之前、之后的字符取来进行了一下判断,不会影响后边的表达式来真正的匹配。
反向预搜索:"(?<=xxxxx)","(?<!xxxxx)"
这两种格式的概念和正向预搜索是类似的,反向预搜索要求的条件是:所在缝隙的 "左侧",两种格式分别要求必须能够匹配和必须不能够匹配指定表达式,而不是去判断右侧。与 "正向预搜索" 一样的是:它们都是对所在缝隙的一种附加条件,本身都不匹配任何字符。
根据需求,我们很明确的看到这一个标准的正向预搜索,但反过来一看不就是不匹配全是字符是字符串。
所以层层具体下来,我们先容易得出想要的答案
(?![a-zA-Z]+$)//不匹配只有a-zA-Z_的串,意思则为特殊字符的个数必须大于等于1
一起组合起来我们就得到我们完整的答案:^(?![a-zA-Z]+$)[a-zA-z~!@#$%^&*()_+|]{2,15}$
近日在水源又看到有朋友在问关于限制用户名的正则表达式
整理了一下,共三个要求:
1.大于6位
2.字母+数字
3.最少二个字母
其实这个问题我记得早在很久以久CSDN上的过客兄就对这个问题做了非常详细的介绍和解答,不过好像大家没有吸引到
在这里借花献佛再次给大家分析一下^_^
我写正则一般是先满足整体,再求局部修正,标准的自顶向下解决模式
只要大家对正则有些了解的朋友都知道,前两个需求实在太简单了
我们先把其写出来,应该说这大框架就已经实现
即
^[a-zA-Z0-9]{6,}$
接着进行局部的修正,满足所有的要求,最少二个字母,然而位置不确定,这必定需要用到我们的正反向预搜索
在过客兄的贴子中他使用的是反向预搜索,当然我们现在也可以考虑用他的方法,懒的想嘛^o^.
按照它的思路分析就是我们必须不能匹配输入项上字母个数为0个或是1个的.
不过这样写貌似表达会产生一些问题,总之就是似乎不太好用.其实这个方案完全没有必要使用反向预搜索机制
简单的正向匹配就可以了,想想我们直接去匹配字母个数大于等于2个以后的匹配,那样是不是更简单呢.^o^.
看来还是不能偷懒,以下是正向预搜索机制解答的全部答案
^(?=(?:.*?[a-zA-Z]){2,})[a-zA-Z0-9]{6,}$
是不是比反向的更简单更容易理解呢.不过前面也留到一个问题..就是反身预搜索的时候不太好用...
这个原因,得好好研究一下^0^.
转自:http://www.cnblogs.com/symbol441/archive/2007/09/24/903990.html
分享到:
相关推荐
正则式.pdf正则式.pdf正则式.pdf正则式.pdf正则式.pdf
编译原理课的大作业 包含三个小实验 在一个cpp文件里 正则表达式转换为nfa nfa转换为dfa dfa最小化 个人原创代码
正则式,验证工具,测试正则式,开发过程中可以先把写好的正则式放在里面做一下测试,确保发布正确率。
编译原理-正则式,NFA,DFA,可以使用,放心下载
正则表示式教程CHM,正则表示式教程CHM,正则表示式教程CHM
实现了从正则式子到NFA,NFA到DFA,并最小化DFA的过程,
正则表示式工具,正则表示式工具,正则表示式工具正则表示式工具
这是编译原理的一个实验, 是把一个正则表达式转化为不确定有穷自动机NFA的算法程序,朋兴趣的朋友可以下载来看看哦. 一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式...
编译原理正则式转NFA转DFA以及最小化
第11.25节 Python正则表达式编译re.compile及正则对象使用.rar
自动生成正则式,对正则式进行检验,很好的工具~
完整正则式使用大全 基本上常用的正则式都列出来了。而且讲解了原理
JS与正则式强化训练作业.pdf
整理的网上一篇VBA正则式方面的文章
TPerlRegEx(Delphi正则式控件) TPerlRegEx Delphi正则式控件 支持 d5 到 d2009。
我们常常在设定限制的时候会用到的,这几个是最常用的啊
编译原理试验,dfa简单编译器,以定义好正则式(a|b)*ab,输入字符串,可以判断是否可以接受。
编译原理中的正规式到nfa的转换 超详细的课程设计
对bin文件查找出指定格式字符,采用正则式表达
大学课程中编译原理课程的正则表达式章节中关于正则表达式的理解和应用,使用Java GUI进行编写,主要包括了各种主要的正则匹配和正则使用