本文共 1392 字,大约阅读时间需要 4 分钟。
嗯。。。。看标题,有点迷糊,实在是文盲也形容不好这个说法
先看一个简单的例子,有任意长度的数字字符串,判断整个数字字符串有且仅有3个数字,即:1122331122为正确,1122为错误,1234也为错误
其实,这个正则还算比较简单,只需要有个思路一般都能写出来
各位先按照文盲的思路来实现以下
第一步:判断整个字符串是纯数字字符串
^(?=[\d]+$) ,如果有长度要求,自行替换+符号
如果有格式要求,比如手机号,那么就这么写 ^(?=1\d{10}$)
好,然后问题来了,怎么判断是否已经有了三个不同的数字了呢?这就需要用到分组引用了
先来看看这个
^(?=[\d]+$)(\d)\1\1,这个正则的意义很明显,即在数字字符串开始,前三个是相同的数字,类似 111234、333666999这样的,其中\1就是引用的第一个分子(\d)
那么,我们现在再次使用分组,找出第二个数字,正则大概如下
^(?=[\d]+$)(\d)(?:\1*?)((?!\1)\d),这个也不算复杂,红色部分为第一个分组,也就是第一个数字,绿色部分表示,可以有与第一个数字相同的数字,也可以没有,但这个相同数字不参与分组,使用?:修饰符,然后就是蓝色部分,\d表示匹配一个数字,在\d前,紫色部分进行修饰,描述这个数字不能与第一个数字相同,这样就找到了第二个数字
那么,有三个不同数字组成的数字字符串的验证正则,按照以上思路就可以得到最后的正则表达式
^(?=[\d]+$)(\d)(?:\1*?)((?!\1)\d)(?:\1|\2)*((?!\1|\2)\d)(\1|\2|\3)*,好了,必有有三个数字,且只能有三个数字的正则验证就这样完成了
稍微调整一下^(?=[\d]+$)(\d)(?:\1*?)((?!\1)\d)?(?:\1|\2)*((?!\1|\2)\d)?(\1|\2|\3)*,在第二和第三个数字上加上长度修饰符?,那么就可以是1到3个数字组成的数字字符串了
那么,这个表达式有没有使用场景呢?虽然不多,但确实是有的
我们扩展一下,检查一片文章,文章中可以出现以下几组词语,但最多使用4组,那么就可以用上边这个正则变形一下
比如,有词组“军工”、“航天”、“运输”、“探测”、“信号”、“传递”、“地图”,检测文章内是否出现超过三个不同的词组
示例正文1:我们的产品是军工品质,用于地图探测、信号传递等领域 ,使用了5个不同的词组
示例正文2:在运输系统中,地图是一个基本的参数,信号传输则是重要的辅助手段,使用了三个词组
^(?:(?!军工|航天|运输|探测|信号|传递|地图).)*(军工|航天|运输|探测|信号|传递|地图)(?:(?!军工|航天|运输|探测|信号|传递|地图).)*((?!\1)(?:军工|航天|运输|探测|信号|传递|地图))(?:(?!军工|航天|运输|探测|信号|传递|地图).)*((?!\1|\2)(?:军工|航天|运输|探测|信号|传递|地图))(?:(?!军工|航天|运输|探测|信号|传递|地图).)*(?!.*(?!\1|\2|\3)(军工|航天|运输|探测|信号|传递|地图))
使用这个正则就可以进行验证了,与上边数字不同的地方在于,可以有非定义词组的内容出现,也就是(?:(?!军工|航天|运输|探测|信号|传递|地图).)*
转载地址:http://gxvxi.baihongyu.com/