博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
正则判断内容中,不得出现多个不同结果组
阅读量:4162 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
从程序员到架构师的方法与逻辑
查看>>
23个设计模式的简明教程
查看>>
Redis错误配置详解
查看>>
WinHex中文版下载 v16.9 汉化破解版
查看>>
Javascript中最常用的125个经典技巧
查看>>
Java面试题和答案解析
查看>>
程序员既要写好代码,又要写好文档
查看>>
20个设计模式和软件设计面试问题
查看>>
微管理—给你一个技术团队,你该怎么管
查看>>
流程在企业内的作用及成熟度
查看>>
项目设计到开发过程中,需要注意的知识点总结
查看>>
程序员生存定律-六个程序员的故事(1)
查看>>
[企管怪谈]企业怎么留住领导?
查看>>
STL容器与默认拷贝构造函数,默认赋值函数
查看>>
为什么C/C++语言使用指针
查看>>
程序员的自我修养(1)——操作系统篇
查看>>
多线程执行CPU过高问题
查看>>
开发者应该了解的API技术清单!
查看>>
Linux中安装g++编译器 及 svn add .so
查看>>
手把手教你怎么去除Android APP里面的广告
查看>>