正则表达式
正则表达式是一种查找以及字符串替换操作。正则表达式在文本编辑器中广泛使用,比如:
- 检查文本中是否含有指定的特征词
- 找出文中匹配特征词的位置
- 从文本中提取信息,比如:字符串的子串
- 修改文本
正则表达式是什么?
正则表达式只是一个字符串。没有长度限制,但是,这样的正则表达式长度往往较短
如下所示:
- I had a s + day today
- [A – Z a – z 0 – 9-_]{ 3,16 }
- dddd-dd-dd
- V(d+)(.d+)*
- TotalMessages=’’(.*?)’’
- <[^<>]>
- 每一个正则表达式都有输入(文本)和输出(匹配规则的输出,有时是修改后的文本)
特别提醒:正则表达式与文本统配语法无关,比如 *.xml
正则表达式的基础语法
字符
正则表达式中包含了一系列字符,这些字符只能匹配他们本身。有一些被称为“元字符”的特殊字符,可以匹配一些特殊规则
如下所示,红色为元字符
- I had a s + day today
- [A – Z a – z 0 – 9-_]{ 3,16 }
- dddd-dd-dd
- V(d+)(.d+)*
- TotalMessages=’’(.*?)’’
- <[^<>]>
大部分的字符,包括所有的字母和数字字符,是普通字符。也就意味着,他们只能匹配他们自己。
到目前为止,正则表达式的功能类似于
- 常规的find功能
- Java中的 String.indexOf() 函数
- PHP中的 strops()函数
- 等等
注意:不做特殊说明,正则表达式中是区分大小写的。但是,几乎所有的正则表达式的实现,都会提供一个Flag用来控制是否区分大小写。
- “ . ”
元字符“.”,意味着可以匹配任意字符
如:c.t可以匹配cat,cot,cxt……
2.“ ”
使用反斜杠“”可以忽略元字符,使得元字符的功能与普通字符一样。
如:c.t 表示找到字母c,然后是一个句号(“.”),紧跟着是字母t
反斜杠“”本身也是一个元字符,这意味着反斜杠本身也可以通过相似的方法变回到普通字符的用途。因此,正则表达式:
c\t 表示匹配 以字符c开头,然后是一个反斜杠(),紧跟着是字母t
字符类
字符类是一组在方括号内的字符,表示可以匹配其中的任何一个字符
- A[0-9]t 表示匹配以A开头,接着是0-9中任何一位字符,最后以t结尾
- [[]ab]表示匹配的字符为“[”或者“]”或者“a”或者“b”
- l [\[]] 表示匹配的字符是“”或者“[”或者“]”
在字符类中,字符的重复出现和出现顺序并不重要。[dabaaabcc]和[abcd]是相同的
重要提示:字符类中和字符类外的规则有时不同,一些字符在字符类中是元字符,在字符类外是普通字符。一些字符正好相反。还有一些字符在字符类中和字符类外都是元字符,这要视情况而定!
在字符集中,短横线(-)表示匹配字母或数字的范围([0-9]),在字符类之外,短横线没有特殊含义(a-z:表示匹配字符串以a开头,然后是一个短横线,以z结尾)
注意:范围的字符值代表的是字符而已,并不能代表数值范围,比如[1-31]表示匹配一个数字,是1或者2或者3,而不是匹配一个数值在1到31之间的数
字符类的反义(在字符的起始位置放一个反义符)
- [^a]表示匹配任何不为a的字符
- [^ab]表示匹配一个为“^”或者a或者b的字符
- [^^]表示匹配任何不为“^”的字符
转义字符类
d 这个正则表达式与[0-9]作用相同,都是匹配一个数字(要匹配d,应该使用正则表达式\d)
w 与[0-9A-Za-z]相同,都表示匹配一个数字或字母字符
s 意味着匹配一个空字符(空格、制表符,回车或者换行)
另外
- D 与[^0-9]相同,表示匹配一个非数字字符
- l W 与[^0-9A-Za-z]相同,表示匹配一个非数字同时不是字母的字符
- l S 表示匹配一个非空字符
重复
在字符或字符集之后,你可以使用{ }大括号来表示重复
- l a{1}与a意思相同
- l a{3}匹配“aaa”字符串
- l a{2}表示匹配字符串“a{2}”
- l 在字符类中,大括号没有特殊含义。[{}]表示匹配一个{或者}
指定重复次数范围
重复次数是可以指定范围的
- x{4,4} 与x{4}相同
- colou{0,1}r 表示匹配colour或者 color
- a{3,5} aaaaa aaaa aaa
- 范围可以是开区间:a{1,}匹配一个或以上连续字符a
注意:这样的正则表达式会优先匹配最长字符串
关于重复的转义字符
- ?与{0,1}相同,如:colou?r表示匹配colour或者color
- *与{0,}相同,如: .*匹配任意内容
- +与{1,}相同
此外:
- ?*+表示匹配字符串“?*+”
- [?*+]表示匹配一个?,或者一个*,或者一个+
非贪婪匹配
正则表达式“.*”表示匹配双引号,之后是任意内容,之后再匹配一个双引号。
- d{4,5}?表示匹配dddd或者ddddd。和d{4}一样
- Colou??r与colou{0,1}r相同,表示找到color或者colour,与colou?r一样
- “.*?”表示先匹配一个双引号,然后匹配最少的字符,然后是一个双引号
选择匹配
用“|”来分隔可以匹配不同的选择
- cat|dog表示匹配“cat”或者“dog”
- red|blue|或者red||blue或者|red|blue都表示匹配red或者blue或者一个空自负串
- a|b|c与[abc]相同
- [cat|dog]表示匹配a或者c或者d或者g或者o或者t或者一个分隔符“|”
分组(用括号表示分组)
- (w*)ility 与 W*ility相同,都是匹配一个由“ility”结尾的单词
- [()]表示匹配任意一个左括号或者一个右括号
分组可以包括空字符串:
- (red|blue)表示匹配red或者blue或者是一个空字符串
- Abc()def与abcdef相同
在分组的基础上使用重复:
- (red|blue)?与(red|blue|)相同
- l w+(s+w+)表示匹配一个或多个由空格分隔的单词
单次分隔符
- 表示匹配一个单词分隔符
- www表示匹配一个三字母单词
- aa表示匹配两个a中间有一个单词分隔符。这个正则表达式永远不会有匹配的字符,无论输入怎样的文本。
单词分隔符本身并不是字符,它的宽度为0
下列正则表达式的作用不同
- (cat)
- (cat)
- (cat)
- (cat)
换行符
注意:所有的文本都是以一行结束的,而不是以换行符结束。
- ^表示匹配行的开始位置
- $表示匹配行的结束位置
- ^&表示一个空行
- ^.*&表示匹配全为内容,因为行的开始符号也是一个字符,“.”会匹配这个符号。找到单独的一行,可以使用^.*?$
- ^$表示匹配字符串“^$”
- [$]表示匹配一个$。但是,[^]不是合法的正则表达式。记住在方括号中,字符有不同的特殊含义,要想在方括号内匹配^,必须用[^]
与字符分割符一样,换行符也不是字符。它的宽度为0
如下所示的正则表达式作用不同:
- (^cat)$
- (^cat$)
- ^(cat)$
- ^(cat$)
文本 分界
在很多的正则表达式实现中,将^和$作为文本的开始符号和结束符号。
还有一些实现中,用A和z作为文本的开始与结束符号
https://www.cnblogs.com/sthinker/p/6985112.html