zoukankan      html  css  js  c++  java
  • 正则式正反向预编译(实战)

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

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







     


                                  

  • 相关阅读:
    parted分区
    gitlab的还原
    hadoop2.7.3+spark2.0.1+scala2.11.8集群部署
    Daily record-September
    三次握手和四次挥手【转】
    “梅西式”程序员 【转】
    C++解析十-数据封装
    客户端、服务器代码实例
    网络整理
    C++解析九-数据抽象
  • 原文地址:https://www.cnblogs.com/symbol441/p/903990.html
Copyright © 2011-2022 走看看