作者:靠谱的留一手_267 | 来源:互联网 | 2023-09-16 03:53
一、正则表达式的语法
要灵活运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:
1,限定符
2,选择匹配符
3,分组组合和反向引用符
4,特殊字符
5,字符匹配符
6,定位符
限定符:用于指定前面的字符或组合项连续出现多少次。
1,{n}
举例说明:“o{2}”不能与“Bob”中的“o”匹配,但可以与“food”中的两
个“o”匹配,也可与“fooood”中的任意两个连续的“o”匹配。
2,{n,}
举例说明:“o{2,}”不能与“Bob”中的“o”匹配,但可以与“foooood”中的所有
的“o”匹配。
3,{n,m}
举例说明:“o{1,3}”既可匹配“food”中的两个“o”,又可匹配“fooood”中的
连续的三个“o”。
4,+ (前面的元素或组合项至少出现一次)
举例说明:“zo+”与“zo”和“zoo”等在字母之z后面连续出现一个或多个字母
O的字符串匹配。(等效如{1,})
5, *(前面的元素或组合项至少出现0次或多次)
举例说明:zo*与“z”和“zoo”都能匹配。*等效于{0,}。
6,?(规定前面的元素或组合项出现0次或1次)
举例说明:“zo?”可以匹配“z”或“zo”,也可以匹配“zoo”中的“zo”部分
,但不能匹配整个“zoo”。(等效于(0,1))
贪婪匹配与非贪婪匹配
1. 贪婪匹配
默认情况下,正则表达式使用最长(也叫贪婪)匹配原则。例如,要将
“zoom”中匹配“zo?”的部分替换成“r”,替换后的结果是“rom”
不是“room”;如果要将“zoom”中匹配“zo”部分替换成“r”,替换后的结果
是“rm”,不是“rom”或“room”。
2. 非贪婪匹配
当字符“?”紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,
匹配模式变成使用最短(也叫非贪婪)匹配原则。例如,在字符串“fooood”
中,“fo+?”只匹配“fo”部分,而“fo+”匹配“foooo”部分。
选择匹配符:
选择匹配符只有一人,就是“|”字符,用于选择匹配两个选项之中的任意一个,
它的两个选项是“|”字符两边的尽可能最大的表达式。
举例说明:
“chapter|section 1”匹配的是“chapter”或“section 1”,而不是
“chapter 1”或“section 1”;如果要匹配“chapter 1”或“section 1”,
应该使用括号创建子表达式,即“(chapter|section)1”。
分组组合和反向引用符:
分组组合符:将正则表达式中的某一部分内容组合起来的符号。
反向引用符:用于匹配前面的分组组合所捕获到的内容的标识符号。
• (pattern)(存入缓冲区)
说明:若要匹配字面意义的括号字符“(”和“)”,在正则表达式中要分别
使用“/(”和“/)”。
• /num
举例说明:要匹配连续的5个数字字符,可以使用/d{5}作为是正则表达式文本
但是,要匹配连续的的5个相同的数字字符,需要使用(/d)/1{4}作为正则表达式文本。要匹配“Is is the cost of of gasoline going up up?”中所有连续重复的单词部分,可以使用//b([a-z]+)/1/b/gi作为正则表达式文本。
• (?:patterm)(不存入缓冲区)
举例说明:不能将“industry|industries”简单地改写成“industr(y|ies)”,
如果不需要引用或检索括号中的表达式所匹配的结果,最好还是改写成“industr(?:y|ies)”。
• (?=pattern)
正向“预测先行”匹配
举例说明:使用“Windows(?=NT|2000)”作为正则表达式模式,它只与“Windows 2000”或“Windows NT”中的“Windows”匹配,而不与“Windows 2003”中的“Windows”匹配。
?多想一想:以“Windows(?=NT|2000)Series”作为正则表达式模式,在文本“My Windows NT Series”中的匹配结果是多少呢?
• (?!pattern)
反向“预测先行”匹配
举例说明:使用“Windows(?!NT|2000)”作为正则表达式,它不与“Windows 2000”或“Windows NT”中的“Windows”匹配,而可以与“Windows 2003”中的“Windows”匹配。
特殊字符
正则表达式中以反斜杠字符(/)后紧跟其它转义字符序列来表示非打印
字符和原义字符。
• /xn
ASCⅡ码值等于n的字符,这里的 n必须是两位的十六进制数
举例说明:“/x41”匹配字符“A”。注意:“/x041”所表示的字符
后跟字符“1”。
• /n
要求这里的n(0-7)是一个一位的八进制数,如果这里的n前面至少
有n个捕获子匹配,那么这个斜杠n它就是被用作反向引用,否则它就是被
用作匹配ASCII码值等于这个n的字符
• /nm
这里的m和n都是一位的八进制数如果在这个表达式的前面至少有nm个捕获子表达式,那么这个格式就是反向引用,如果前面至少有n个捕获,那么这个表达式的/n部分就是反向引用,那么后面m就是字面意义上的数字字符了,如果刚才说的那些条件都不存在,那么它才是匹配ASCII码的值的八进制形式等于nm的那个字符
• /nml
当n是0到3之间的八进制数和m和l是0到7之间的八进制数的时候,它才能匹配ASCII码值的八进制形式等于nml的那个字符。
• /un
用来匹配Unicode码等于n的字符,这里的n必须是一个四位的十六进制数据
举例说明:/u00A9匹配版权符号。
• /CX
匹配由X所指定的控制字符。这个X的值必须是大写的A到Z或
小写的a到z之间的一个字符,否则这个C完全是字面意义上的字符
C本身,X是原来的字符意义了,而不再表示控制字符了
举例说明:/cM匹配Control+M表示的控制字符,也就是回车符。
• /f
匹配换页符,等效于/x0c和/cL。
• /n
匹配换行符,等效于/x0a和/cJ。
• /r
匹配回车符,等效于/x0d和/cM。
• /t
匹配制表符,等效于/x09和/cl。
• /v
匹配垂直制表符,等效于/x0b和/cK。
字符匹配符
字符匹配符:用于指定该符号部分可以匹配多个字符中的任意一个。
• […]
说明:如果字符集中要包含“]”字符,需要将它放在第一位,即紧跟在开始“[”后面。[…]中的字符“/”仍然作为转义符,若要在[…]中包含“/”本身,需要使用“//”。
• [^…]
说明:只要字符“^”不是出现在第一个“[”后面,它就是还是字面意义上的“^”。
• [a-z]
说明:要在中括号表达式中包括字面意义的连字符(-),可以用反斜杠(/)将它
标记为原义字符,例如,[a/-z],但此时指的是三个字符了。也可以将连字符(-)放在方括号的开始或结尾处,例如,[-a-z]或[a-z-]。
• [^a-z]
• /d
可以匹配任意一个数字字符。
• /D
它可以匹配一个非数字字符。
• /s 等效于[ /f/n/r/t/v]。
它可以匹配任何空白字符。
• /S 等效于[^/f/n/rt/v]。
它可以匹配任何非空白的字符。
• /w 等效于[A-Za-z0-9_]。
它可以匹配任何英文字母和数字类的字符以及下划线。
• /W 等效于[^A-Za-z0-9_]。
• .
它可以匹配除了/n以外的单个任何字符。
说明:“(.)/1”匹配除了“/n”以外的两个连续的相同的字符。若要匹配
包括“/n”在内的任意字符,可以使用“[/s/S]”,“[/d/D]”或“[/w/W]”
等模式。若要匹配“.”字符本身,需要使用“/.”。
定位符
定位符:用于规定匹配模式在目标字符串中的出现位置。
• ^
用于匹配目标字符串的开始位置,规定匹配必须发生在目标字符
串的开始位置上。
举例说明:“^o”与“ok”中的“o”匹配,但与“hello”中的
“o”不匹配。如果设置了RegExp对象实例的Multiline属性,
^还会与行首匹配,即与“/n”或“/r”之后的位置匹配。
• $
用于匹配目标字符串的结尾位置,规定匹配必须发生在目标
字符串的结尾。这个$ 只能写在表达式的末尾才能发生此作用。
举例说明:“o$”与“hello”中的“o”匹配,但与“ok”中的
“o”不匹配。如果设置了RegExp对象实例的Multline属性,
$还会与行尾匹配,即与“/n”或“/r”之前的位置匹配。
• /b
它可以匹配一个字边界,也就是一个单词的边界。
它包含了字与空格间的位置以及目标字符串的开始和结束等位置。
举例说明:“er/b”匹配“never ok”中的“er”,但不匹配“verb”
中的“er”。
• /B
用来匹配非字边界的情况。
举例说明:“er/B”匹配“verb”中的“er”,但不匹配“never”中的“er”。
原义字符
在正则表达式中用到的一些元字符不再表示它原来的字面意义,如果要匹配这些具有特殊意义的元字符的字面意义,必须使用反斜扛(/)将它们转义为原义字符,即将反斜杠字符(/)放在它们前面。
需要进行转义的字符:
“$”、“(”,“)”、“*”、“+”、“.”、“[”、“]”、“?”、“/”、“/”、“^”、“{”、“}”、“|”
优先级顺序
正则表达式从左到右进行计算,并遵循优先级顺序。例如,“*”比字符的优先级高,“ab*”是“b”和“*”组合后、再和前面的“a”组合。“()”比“*”的优先级高,“(ab)*”是“a”和“b”组合后、再和后面“*”组合。字符比“|”的优先级高,“a|bc”是“b”和“c”组合后,再和前面的“a”进行选择组合,是“a”和“b”进行选择组合,再和后面的“c”组合。
一些正则表达式范例:
• 匹配空行: /^/s*$/
• 匹配HTML标记&#xff1a; /<(/S&#43;)(/s[^>]*)?>[/s/S]*//1/s*>/
• 匹配email地址&#xff1a; /&#xff3b;a-zA-Z0-9_-&#xff3d;&#43;&#64;[ a-zA-Z0-9_-]&#43;(/.[ a-zA-Z0-9_-]&#43;)&#43;/
• 匹配两个相同的相邻单词&#xff1a; //b([a-z]&#43;/1/b)/
• 匹配ip地址&#xff1a;/^(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])(/.(/d{1,2}|1/d/d|2[0-4]/d|25[0-5])){3}$/