Regular Expression功能
- 正则表达式描述了一种字符串匹配模式(pattern),
- 通过该模式可以用来:
- 检查一个串是否含有某种子串;
- 将匹配的子串替换;
- 从某个串中取出符合某个条件的子串等。
Regular Expression基本构成
- 正则表达式是由普通字符(例如字符 a到z)以及特殊字符(称为"元字符")组成的文字模式;
- 正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合;
- 使用多种元字符与运算符可以将小的表达式结合在一起来创建更大的表达式。
普通字符
- 普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。
- 普通字符包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
特殊字符
- 特殊字符,就是一些有特殊含义的字符,
- 元字符要求在试图匹配它们时特别对待,若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。如下表所示,列出了正则表达式中的特殊字符:
特殊字符之限定符
- 限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
- 有 * 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种,如下表所示:
- 限定符出现在范围表达式之后,它应用于整个范围表达式
*
和+
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?
就可以实现非贪婪或最小匹配。
示例
-
用正则表达式匹配一个正整数,[1-9]设置第一个数字不是 0,[0-9]* 表示任意多个数字,也可以是0个。
/[1-9][0-9]*/
-
用正则表达式至少指定一位但至多两位数字,即数字范围是0~99
/[0-9][0-9]*/
-
用正则表达式匹配最多两位数的正整数,即数字范围是1~99
/[1-9][0-9]?*/
或者/[1-9][0-9]{0,1}*/
-
用正则表达式搜索 HTML 文档,查找在 h1 标签内的内容
- 比如h1标签的内容是
<h1>S5850-24T16S</h1>
- 贪婪匹配:会匹配从开始小于符号 (<) 到关闭 h1 标记的大于符号 (>) 之间的所有内容。
/<.*>/
- 非贪婪匹配(最小匹配):会匹配第一个小于符号 (<) 和第一个大于符号 (>) 之间的所有内容,也就是匹配第一个h1
/<.*?>/
或者/<\w+?>/
特殊字符之定位符
- 定位符能够将正则表达式固定到行首或行尾;
- 定界符也能够将正则表达式固定在单词开头、单词内、单词结尾。
- 不能将限定符与定位符一起使用。
- 若要匹配一行文本开始处的文本,请在正则表达式的开始使用
^
字符。不要将^
的这种用法与中括号表达式内的用法混淆。
示例
-
用正则表达式匹配一个章节标题,该标题只包含两个尾随数字,标题处在行首和行尾之间:
/^Chapter [1-9][0-9]{0,1}$/
或者/^Chapter [1-9][0-9]?$/
-
用正则表达式匹配单词 Second的开头三个字符:
/\b Sec/
-
用正则表达式匹配单词 Second的结尾三个字符:
/\b ond/
-
用正则表达式匹配单词 Second的中间三个字符con,但是不会匹配console中的字符串con:
/\B con/
选择
- 将圆括号
()
所有选择项括起来,相邻的选择项之间用 | 分隔,表示匹配条件有多个,彼此之间的关系是或 - 用圆括号
()
进行会使相关的匹配会被缓存,可以用?:
放在第一个选项前来取消匹配缓存。 - 正向预查
?=
,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串; - 负向预查
?!
,在任何开始不匹配圆括号内正则表达式模式的位置来匹配搜索字符串。
反向引用
- 使用圆括号
()
进行数据匹配,会将匹配成功的数据存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。 - 缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。
- 每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的数字编号。(比如\11表示访问第十一个子匹配的缓冲区)
示例
- 使用正则表达式查找文本中两个相同的相邻单词
-
输入字符串:
“good good study, day day up”
-
正则表达式:
/\b([a-z]+) \1\b/ig
-
匹配结果:
good good
和day day
-
该正则表达式的匹配条件可以看做三个部分:
([a-z]+)
、(一个空格)和
\1
:
(1)[a-z]+
表示匹配一个或者多个字母,([a-z]+)
表示子匹配项,匹配结果会存储在编号为1的缓冲区
(2)(一个空格)表示匹配一个空格
(2)\1
表示匹配编号为1的缓冲区数据 -
\b
表示匹配单词的边界,比如“is issued”
字符串就不会别匹配 -
\i
表示匹配时不区分大小写 -
\g
表示将该匹配表达式应用到输入字符串中,能够查找到的尽可能多的匹配。(多次匹配)