正则表达式(regular expression [regExp])超详细讲解一篇顶十篇
一个正则表达式,就是用某种模式去匹配字符串的一个公式。许多语言都提供了对正则表达式的支持
1, 提取某段文字中的所有英语单词
2, 提取数字
3, 提取数字和英语单词
找出文本中的所有数字子串
验证电子邮件和手机号码格式
正则表达式技术是对字符串进行模式匹配的技术
- 根据groups[0] 和 groups[1] = 4的记录位置,从content开始截取子字符串返回就是[0, 4]包含0但是不包含索引为4的位置
- 关于groups数组的理解:比如匹配(//d//d)(//d//d),匹配四位数的数字,第一组的值即找到1998。group[1] = 19; group[2] = 98
- 如果正则表达式分组(),即分组,则匹配规则如下
group[0]:表示匹配到的子字符串
group[1]:表示匹配到的子字符串的第一组子串
group[2]:表示匹配到的子字符串的第二组子串
但是匹配到的子字符串不能越界
想要灵活的使用正则表达式,必须了解其中各种元字符(Metacharacter)的功能,从功能上大致分为
- 限定符
- 选择匹配符
- 分组组合和反向引用符
- 特殊字符
- 字符匹配符
- 定位符
\\\\:转义字符,表示一个 \\ ,
在其他语言中,\\表示一个反斜杠
例如:要匹配 . 的正则为 \”\\\\.\”, 而不是”.“ 。
[ ]:可接受的字符列表
eg:[efgh]:e, f, g, h 中的任意一个字符
[^]:不可接受的字符列表
eg:除a, b, c 之外的任意一个字符,包括数字和特殊符号
– :连字符
eg:A-Z:任意的单个大写字母
. :匹配除\\n以外的任何字符,如果要匹配 . 要用转义符
eg:a..b : 以a开头,b结尾,中间包括2个任意字符的长度为4的字符串,aaab,a67b,a%¥b
\\\\d : 匹配单个的数字字符,相当于[0-9]
eg:\\\\d{3}(\\\\d)? 包含3个或者4个数字的字符串,123,4567
\\\\D:匹配单个非数字字符串,相当于[\\^0-9]
eg:\\\\D(\\\\d)*, 以单个非数字字符开头,后接任意个数字字符串,a、A342、b45678
\\\\w:匹配单个数字,大小写字母字符,相当于[-9a-zA-Z]
eg:\\\\d{3}\\\\w{4}, 以3个数字字符开头的长度为7的数字字母字符串,234abcd、12345pe
\\\\W:匹配单个非数字,大小写字母字符,相当于[\\^0-9a-zA-Z]
eg:\\\\W+\\\\d{2}, 以至少1个非数字字母字符开头,2个数字字符结尾的字符串,#29、#@!10
\\\\s: 匹配任何空白字符,(空格,制表符等)
\\\\S: 相当于对s取反,匹配任何非空白字符
Java的正则表达式是区分字母大小写的,如何实现不区分大小写:
- (?i)abc 表示abc都不区分大小写
- a(?i)bc 表示bc都不区分大小写
- a((>i)b)c 表示b都不区分大小写
- Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); 创建正则表达式对象的时候,加入CASE_INSENSITIVE(不敏感,不区分大小写)
| : 表示选择
用于指定其前面的字符和字符和组合项连续出现的次数
* : 指定字符重复0此或n此(与具体要求)
eg:(abc), 仅包含任意个abc的字符串,等效于\\w\\, abc、abcabcabc
+:指定字符重复次或者n次(至少1次)
eg:m+(abc)*, 以至少一个m开头,后接任意个abc的字符串,m、mabc、mabcabc
?:指定字符重复0次或者1次(最多一次)
eg:m+abc?, 以至少一个m开头,后接ab或者abc的字符串,mab、mabc、mmmab、mmabc
{n}:只能输入n个字符
eg:[abcd]{3}, 以abcd组成的任意长度为3的字符串,abc、dbc、acd
{n,}:指定至少n个匹配
eg:[abcd]{3,}, 由abcd中字母组成的任意长度不小于3(>=3)的字符串,aab、dbc、aaabdc
{n,m}:只当至少n个但不多于m个匹配
eg:[abcd]{3,5},由abcd中字母组成的任意长度不小于3,不大于5(5>=x>=3)的字符串,abc、abcd、badab、badca
^: 指定起始字符,^[0-9]+[a-z]*,以至少1个数字开头,后接任意个小写字母,123、6aa、555edf
$:指定结束字符,^[0-9]\\\\-[a-z]+$,以1个数字开头后接连字符”-“,并以至少一个小写字母结尾的字符串,1-a
\\\\b:匹配目标字符串的边界,han\\\\b,这里的字符串的边界指的是子串间有空格,或者是目标字符串的结束位置,hansunping、sphan、nnhan
\\B:匹配目标字符串的边界,han\\\\B,和\\b的含义相反,hanshunping,sphan,nnhan
- 常用分组
常用分组构造形式
(pattern):非命名捕获,捕获匹配的子字符串。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则根据左括号的顺序从1开始自动编号。
(? <name> pattern):命名捕获,将匹配到的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?\’name\’)
(?:pattern):匹配pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。但这对于“or”字符(|)组合模式部件的情况很有用。例如:\’industr(?:y|ies)\’是比,\’indeustry|industries\’更经济的表达式
(?=pattern):它是一个非捕获匹配。例如,\’Windwos(?=95|98|NT|2000)\’ 的匹配 “Windows 2000” 中的 “Windows 3.1” 中的\”Windows\”
(?!patter):该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。他是一个非捕获匹配。例如,\’Windwos(?=95|98|NT|2000)\’ 匹配“Windows 3.1” 中的\”Windows\”,但不匹配 “Windows 2000” 中的 “Windows“。
?:当此字符紧随任何其他限定符(*, +, ?, {n}, {n,}, {n,m})之后时,匹配模式是”非贪心的“。”非贪心的“模式匹配搜索到的,尽可能短的字符串,默认的”贪心“模式匹配搜索到的,尽可能长的字符串。例如在\”oooo\”, \”o+?\”只匹配单个\”o\”, 而“o+”匹配所有 “o”。
是一个非强制异常类,表示一个正则表达式模式中的语法错误
- 分组:用圆括号组成一个比较负责的匹配模式,那么一个圆括号的部分我们可以看作是一个子表达式或者一个分组
- 捕获:把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推,组0代表的是整个正则式
- 反向引用:圆括号内的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称之为反向引用,这种引用既是可以在正则表达式内部,也可以是在正则表达式外部,内部反向引用 \\\\ 分组号,外部反向引用 $ 分组号
结巴去重案例
正则表达式大全
正则表达式不管是做哪方面开发的朋友都会使用到,但是有好多人不太懂正则正则表达式,又因为用的频率比较低的缘故又懒得去看,用的时候就直接到网上找一下,但经常在网上去找很久,结果也不一定跟需要的符合。今天我把咱们经常用到的一点先放上来,如果那些用的多的在慢慢添加更新。
1、纯数字正则:^[0-9]*$
2、 有n位的数字正则:^\\d{n}$
3、至少有n位数字的正则:^\\d{n,}$
4、位数在m-n位之间的正则:^\\d{m,n}$
5、匹配整数(不区分正负数):^-?[1-9]d*$
6、匹配负整数:^-[1-9]d*$
1、纯英文字母的正则(不区分大小写):^[A-Za-z]+$
2、纯英文大写字母的正则:^[A-Z]+$
3、纯英文小写字母的正则:^[a-z]+$
4、只有数字和26个英文字母的正则:^[A-Za-z0-9]+$
5、字符长度为在m-n位之间的正则:^.{m,n}$
6、以字母开头,长度在6~18之间,只能包含字母、数字和下划线:^[a-zA-Z]\\w{5,17}$
7、以字母开头,长度在6~18之间,只能包含字母、数字不包含下划线:^[a-zA-Z][a-zA-Z0-9]{4,15}$
8、必须且只能包含数字和字母的正则:^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,10}$
以这个为例稍微说一下
^ 表示一行的开始位置 (?![0-9]+$) 表示不全是数字 (?![a-zA-Z]+$) 表示不全是字母 [0-9A-Za-z] {6,10} 表示由6-10位数字或这字母组成 $ 匹配行结尾位置
这个三个条件决定了这个表达式 是必须包含数字和字母 其只能包含数字和字母 并且字符长度位数是在6-10位之间。
9、身份证号(只验证了15位或18位数字)正则:^d{15}|d{18}$
\\w:表示的是数字、字母及下划线。
\\d:表示的只是数字。
^:字符串的开始位置。如果是在[ ]里面的话则表示“非”的意思,就是排除掉[ ]里面包含的内容
^n:表示必须以 n字符串 开头。
$:字符串的结束位置。
?=n:表示后面紧接着跟着字符串 n 。
?!n:表示其后不是紧接跟着字符串 n 。
今天先写这些明天还会继续补充一下其他的,并且对相对复杂点的讲解一下,方便理解。
难倒很多程序员的正则表达式是什么?一文看懂神奇的正则表达式
大家好,我是猴哥!猴哥出品,必是精品,点击关注,给你好看!
持续更新通俗易懂的技术知识,为您护航充电!
本文章节内容
- 什么是正则表达式?—一个例子看懂
- 正则符号详解之普通元字符 —[a-z]比N行代码好用多了
- 正则符号详解之特殊字符 —简洁版的元字符
- 正则符号详解之扩展表示法字符 —比算法都好用
- 两个实用的正则表达式 —够你写半天的代码
本文将对正则表达式进行完整的介绍,以通俗易懂的语言对正则表达式的每个字符功能进行详细解释并通过具体示例进行补充说明,旨在让广大读者朋友们迅速掌握正则表达式这项工作技能并加以出色的运用,助力读者朋友们在脚本语言(Python、JavaScript等)盛行的互联网时代脱颖而出!
正则表达式
一、神奇的正则表达式是什么?
为让读者朋友们先对正则表达式有个大致的概念,本节我们将通过一个非常简单的示例来解释正则表达式到底是什么?如:
正则表达式:[0-9]+
表达式解析:[0-9]表示一位0-9之间的任意数字,注意[0-9]只表示一位数字,+ 号表示前一个正则表达式表示的字符至少重复出现1次以上
表达式功能:表示一位以上的数字,如1,123,,134646757658……除数字外的字符串都不符合该正则表达式
从上例中可以看出,正则表达式其实就是一个描述一种字符串元素组成的符号表达式,字符串只有符合这种格式才是正确的,可以实现一种过滤逻辑功能!
正则表达式虽然描述的是一种字符串元素组成的表达式,但在实际编程应用中是以正则表达式描述的字符串格式来匹配查找对应字符串的。正则表达式可用于各种字符串的检查、验证、查找、提取等程序功能开发,如检查身份证号、密码、账户名等场合!
正则表达式
下面我们将对正则表达式的所有符号及其功能进行详细的讲解,保证读者朋友们能够看懂正则表达式并编写简单的正则表达式,待大家融会贯通之后结合扩展正则符号,编写设计复杂且具有强大功能的正则表达式也将不在话下!
神奇的正则表达式
正则表达式是一种由各种符号组成的逻辑公式,本文将把正则符号分为三大类:普通元字符、特殊字符、扩展表示法字符。下面将介绍第一类:正则表达式中的普通元字符!
二、正则符号详解之普通元字符
普通元字符只有十多个,考虑到理解难度问题,我们将对每个元字符以通俗易懂的语言进行再解释,并结合多个示例再说明,让读者朋友们能够理解更深刻。先来看看正则表达式中的普通元字符有哪些?如下图:
普通元字符集
先来看普通元字符功能与示例:
▲元字符1: value —表示与value字面字符一致的查找功能,如
- abc:表示匹配查找含abc的字符串,例如可匹配查找123abc456、abcdef中的abc
▲元字符2:regex1|regex2 —表示正则表达式regex1或regex2,如
- abc|123:表示查找含abc或123的字符串,例如可查找123abc456、abcdef123中的abc和123
▲元字符3:.(点)—表示查找除空格和空行之外的任何单个单字符,如字母,数字,符号等等
▲元字符4:^ —匹配查找字符串起始部分,如
- ^abc:匹配查找字符串开头为abc的字符串,例如可匹配查找abcdef中的abc,不可匹配查找ababcdef中的abc
▲元字符5:$ —匹配查找字符结尾部分,如
- abc$:匹配查找字符串结尾为abc的字符串,例如匹配查找defabc中的abc,不可匹配查找abcdef中的abc
▲元字符6:* —在*前的第一个正则表达式表示的字符至少出现0次以上,如
- [0-9]*:[0-9]表示一位数字,那么[0-9]*表示匹配查找出现0次以上的数字字符串
▲元字符7:+ —在+前的第一个正则表达式表示的字符至少出现1次以上,如
- [0-9]+:[0-9]表示一位数字,那么[0-9]+表示匹配查找出现1次以上的数字字符串
▲元字符8:? —在?前的第一个正则表达式表示的字符出现0次或1次
▲元字符9:{N} —在{N}前的第一个正则表达式表示的字符出现N次,如
- [0-9]{2}:表示匹配查找由2位0-9之间的数字组成的字符串
▲元字符10:{X,Y} —在{X,Y}前的第一个正则表达式表示的字符出现X到Y次,如
- [0-9]{3,6}:表示匹配查找由3到6位0-9之间的数字组成的字符串
▲元字符11:[…] —匹配查找…中的任意单个字符,如
- [abc]:表示匹配查找含a或b或c字母的字符串
▲元字符12:[p-q] —范围描述,匹配查找p-q范围中任意单个字符,如
- [0-9]:表示匹配查找0-9之间的任意单个数字
▲元字符13:[^…] —非描述符,匹配查找不属于…表示的任意单个字符,如
- [^A-Z]:不匹配查找A-Z之间的大写字母
- [^abc]:不匹配查找字母a或b或c
▲元字符14:(…) —一个封闭的正则表达式,如
- ([A-Z]{2}):匹配查找两个大写字母
对于上面的元字符及其功能,读者朋友们可能还是不清楚具体怎么使用,我们举个实际编程应用中的例子为大家说明。要求:编写程序检查用户输入的内容是否是纯数字,下图是编程解决方案:
- ^[0-9]+$ — 开头结尾都是数字,中间也为数字,中间一位数字重复出现1次以上
正则表达式检查数字
三、正则符号详解之特殊字符
正则表达式的第二类正则符号—特殊字符,可以理解为简洁版的普通元字符,常见的特殊字符有:
以下是文字描述,便于读者复制保存:
▲特殊字符1:\\d —表示匹配查找单个数字字符,等价于[0-9]
▲特殊字符2:\\D —表示不匹配查找单个数字字符,等价于[^0-9]
▲特殊字符3:\\w —表示匹配查找单个字母或数字字符,等价于[a-zA-Z0-9]
▲特殊字符4:\\W —表示不匹配查找单个字母或数字字符,等价于[^a-zA-Z0-9]
▲特殊字符5:\\b —表示匹配查找单词(字符到空格直接的字符串)边界,如
- \\bab:表示可匹配查找able、abnormal等单词中的ab,不能匹配cable中的ab
- y\\b:表示可匹配查找enjoy、city等单词中的y,不能匹配ayc_13ab中的y
▲特殊字符6:\\B—表示不匹配查找单词边界,如
- ew\\B:表示可匹配查找yavewafg中的ew,但不能匹配查找new中的ew
▲特殊字符7:\\s—表示匹配查找空字符,等价于[\\n\\t\\r\\v\\f](换行符/制表符/回车符/垂直制表符/换页符/)
▲特殊字符8:\\S—表示不匹配查找空字符,等价于[^\\n\\t\\r\\v\\f]
▲特殊字符9:\\A—表示匹配查找字符串开头,等价于 ^
▲特殊字符10:\\Z—表示匹配查找字符串结尾,等价于 $
▲特殊字符11:\\x—类似编程中的转义字符,表示匹配查找特殊字符,如
- \\?:匹配查找问号
- \\.:匹配查找点号
- \\*:匹配查找星号
- \\+:匹配查找加号
- ……
四、正则符号详解之扩展表示法字符
提到正则表达式的扩展表示法时,要给大家强调一下,扩展表示法字符实用的只有四个,分别是:(?=…)、(?!…)、(?<=…)、(?<!…)。需要说明的是(?:)与扩展表示法根本就不是一类,尽管很多书籍将其归为扩展表示法,但实际上它只是形式相似而已,所以读者朋友们不必过度在意这个字符,本文也不做赘述。
在详细介绍四种扩展表示法之前,我们先要说明一个概念——断言,又叫预查或环视,先来看术语解释:
四种扩展表示法
什么意思呢?下面我们来看解释,比如说你想提取某个文本中的IP地址,如192.168.***.***,但文本中存在一种情况“56192.168.***.***6564”,虽然这个字符串中存在192.168.***.***,但显然它不是有效的IP地址,也就是说我们在查找IP地址 192.168.***.***的时候,其前后都不能是数字,那么我们就需要提前查看或者环视周围,扩展表示法就起到了这样的作用,如匹配查找office单词:
- office(?=2003|2007|365):只能匹配查找office2003或者office2007或office365中的office,无法匹配office2010中的office,匹配结果只包含office,称为非获取匹配查找
- office(?!2003|2007|365):可以匹配查找office2010中的office,而无法匹配office2003或者office2007或office365中的office,匹配结果只包含office,称为非获取匹配查找
- (?<=上海|北京)人:只能匹配查找上海人或北京人中“人”,而无法匹配广州人中的“人”,匹配结果只包含“人”,称为非获取匹配查找
- (?<!上海|北京)人:只能匹配查找非上海人或北京人中“人”,如广州人中的“人”,而无法匹配上海人或北京人中“人”,匹配结果只包含“人”,称为非获取匹配查找
关于具体的编程应用案例,感兴趣的读者朋友可以直接用今日头条app上方的搜索框输入:“程序员水平进阶之正则表达式”,进入专栏进行查看:
头条搜索
五、附上两个实用的正则表达式
关于以下两种正则表达式的详细解释可参见文章“程序猿技能进阶:设计一条检查用户名是否合法的正则表达式”与文章“程序猿技能进阶:一条正则表达式检查用户密码的合法性”。
★ 检查用户名是否符合要求的正则表达式:
//要求一:用户名必须以字母开头
//要求二:用户名只能包含大小写字母、数字、下划线
//要求三:总长度为6~16位
//用于检查验证用户名是否符合上述要求的正则表达式:^[a-zA-Z][a-zA-Z0-9_]{5,15}$
★ 检查用户密码设置是否符合要求的正则表达式:
正则表达式:((?!^[0-9]+$)(?!^[A-Z]+$)(?!^[a-z]+$)(?!^[^A-Za-z0-9]+$))^.[^\\s]{8,16}$
注:((?!…)(?!…))之间是同时满足的意思
表示由大小写英文字母与数字混合组成的6到16位密码
文中如有不妥之处,敬请批评指正
读者朋友们对于本讲内容中有任何疑问,都可以通过评论、私信等方式留言,与其他读者或者本人进行交流讨论,在下将鼎力协助!
正则表达式
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。