`
bruce198
  • 浏览: 233289 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

正则式正反向预编译(实战)

阅读更多
前些天朋友给了我一个非常有意思的问题,他限制一个输入项必须至少包含一个或一个以上的特殊字符,就问题本身并没有什么实用性,不过还是给出了他答案,下面是我的分析思路。

第一步分析需求
基本要求:输入项要求内容必须为大小写字母加特殊字符组成,长度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
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics