一、正则表达式简介
- 是什么?
- 正则表达式(Regular Expression)是一种文本模式,包括普通字符(如,字母(分大小写)、数字)和特殊符号(称为’元字符’)。
- 能干什么?
- 使用单个字符串来描述和匹配一系列某个句法规则的字符串。
二、语法
-
? 通配符匹配0个或1个字符
-
* 通配符匹配任意个字符
-
^ 匹配输入字符串的开始位置
-
[0-9] 匹配单个数字,[0-9]+匹配多个数字,+表示前面的字符必须出现一次或多次
-
abc$ 匹配以abc字母结尾的字符串,$为匹配输入字符串的结束位置
-
{0, m} 匹配0-m个字符
-
举个列子(图片来自菜鸟教程):
-
非打印字符
字 符 | 描述 |
---|---|
\cx | 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符 |
\f | 匹配一个换页符号 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\s | 匹配一个空白字符,包括空格、制表符 |
\S | 匹配任何非空白字符 |
\t | 匹配一个制表符 |
\v | 匹配一个垂直制表符 |
- 特殊字符(要匹配特殊字符本身都在前面加 \)
特殊字符 | 描述 |
---|---|
$ | 匹配输入字符串的结尾位置。如果设置了RegExp对象的Multuline属性,则$也匹配\n或\r |
() | 标记一个子表示的开始和结束位置。子表示可以获取供以后使用 |
* | 匹配前面的子表达式0次或者多次 |
+ | 匹配前面的子表达式1次或者多次 |
. | 匹配除换行符\n 之外的任何单字符 |
[ | 标记一个中括号表达式的开始 |
? | 匹配前面的子表达式0次或者1,或指明一个非贪婪限定符 |
\ | 将下一个字符标记为特殊字符、或原意字符、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。 |
^ | 匹配输入字符串的开始位置。除非在[]中使用,此时它表示不接受该字符集合。 |
{ | 标记限定符表达式的开始。如,限制 字符串/一个表达式 的个数 |
| | 指明两项之间的一个选择 |
补充:. 特殊字符在中括号表达式时 如 [.] 只会匹配 .字符,等价于 .,而非匹配除换行符 \n 外的所有字符。
[^指定字符串] 指的是除指定字符串以外的其他字符串。
(^[0-9])+ // 匹配有一至多个数字的字符串组合
[^[0-9]]+ // 匹配有一至多个不含数字的字符串组合
- 限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
字符 | 描述 |
---|---|
* | 匹配前面的子表达式0次或多次。如zo*能匹配"z"以及"zoo", 等价于{0, } |
+ | 匹配前面的子表达式1次或多次。如,“zo+“能匹配"zo"以及"zoo”,不能匹配"z”, 等价于{1, } |
? | 匹配前面的子表达式0次或一次。如,"do(es)?“可以匹配"do”、“does”、“doxy”, 等价于{0, 1} |
{n} | n 是非负整数。匹配确定的n次。如,"0{2}“不能匹配"bob"中的’o’, 能匹配"food"中的两个"o” |
{n, } | n是非负整数。至少匹配n 次。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。 |
{n, m} | m 和 n均为非负整数, 且n<=m。最少匹配n次最多匹配m次。"o{0,1}“等价于"o?”。注意在逗号和两个数之间不能有空格 |
注意: *、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
-
举个列子
目标字符串:<H1>Chapter 1 - 介绍正则表达式</H1> -
贪婪模式:
- /<.*>/表达式匹配从开始小于符号 (<) 到关闭 H1 标记的大于符号 (>) 之间的所有内容。
即,匹配的内容为:<H1>Chapter 1 - 介绍正则表达式</H1>
- /<.*>/表达式匹配从开始小于符号 (<) 到关闭 H1 标记的大于符号 (>) 之间的所有内容。
-
非贪婪模式:
- /<.*?>/表达式只匹配开始和结束 H1 标签。即,非贪婪表达式只匹配<H1>。
- 如果只想匹配开始的 H1 标签,表达式则是:/<\w+?>/
补充:通过在 *、+ 或 ? 限定符之后放置 ?,该表达式从"贪心"表达式转换为"非贪心"表达式或者最小匹配。
- 定位符
定位符使您能够将正则表达式固定到行首或行尾。
字符 | 描述 |
---|---|
^ | 匹配输入字符串开始的位置。如果RegExp设置了multiline属性,^ 还会与’\n’,’\r’之后的位置匹配 |
$ | 匹配输入字符串结尾的位置。如果RegExp设置了multiline属性,$还会与’\n’,’\r’之前的位置匹配 |
\b | 匹配一个单词的边界,即字与空格之间的位置。如,’/\bCha/'匹配Chapter 的开头三个字符,因为这三个字符出现在单词边界后面 |
\B | 非单词边界匹配。如,’/\Bapt/'匹配Chapter 中的字符串 apt,但不匹配 aptitude 中的字符串 apt |
- 选择
用圆括号将选项括起来,相邻的选择项之间用|分隔。但圆括号会有一个副作用,使相关的匹配会被缓存,此时可用 ?:放在第一个选项前来消除这个副作用
注意: 不能将限定符与定位符一起使用。由于在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许诸如 ^* 之类的表达式
补充:
其中?:是非捕获员之一,还有两个非捕获元是?=和?!?=表示正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串
?! 表示负向预查,在任何开始不匹配正则表达式模式的位置来匹配搜索字符串
-
反向引用
-
对一个正则表达式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从1开始,最多存储99个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中n为一个标识特定缓冲区的编号(1=<n<=99)
-
可以使用非捕获元字符 ?: 、?= 、 ?! 来重写捕获,忽略相关匹配的保存
例子一: // 查找重复的单词 var str = "Is is the cost of of gasoline going up up"; var patt1 = /\b([a-z]+) \1\b/ig; document.write(str.match(patt1)); // 结果:Is is,of of,up up
解释:
[a-z]+ 匹配一个或多个字母。
正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。
\1 指定第一个子匹配项。
单词边界元字符确保只检测整个单词。否则,诸如 “is issued” 或 “this is” 之类的词组将不能正确地被此表达式识别。
正则表达式后面的全局标记 g 指定将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。
表达式的结尾处的不区分大小写 i 标记指定不区分大小写。
多行标记指定换行符的两边可能出现潜在的匹配。例子二: // 将通用资源指示符 (URI) 分解为其组件。假定您想将下面的 URI 分解为协议(ftp、http 等等)、域地址和页/路径 var str = "http://www.runoob.com:80/html/html-tutorial.html"; var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/; arr = str.match(patt1); for (var i = 0; i < arr.length ; i++) { document.write(arr[i]); document.write("<br>"); } // 结果 : http://www.runoob.com:80/html/html-tutorial.html http www.runoob.com :80 /html/html-tutorial.html
解释:
str.match(patt1) 返回一个数组,实例中的数组包含 5 个元素,索引 0 对应的是整个字符串,索引 1 对应第一个匹配符(括号内),以此类推。
第一个括号子表达式捕获 Web 地址的协议部分。该子表达式匹配在冒号和两个正斜杠前面的任何单词。
第二个括号子表达式捕获地址的域地址部分。子表达式匹配 : 和 / 之后的一个或多个字符。
第三个括号子表达式捕获端口号(如果指定了的话)。该子表达式匹配冒号后面的零个或多个数字。只能重复一次该子表达式。
第四个括号子表达式捕获 Web 地址指定的路径和 / 或页信息。该子表达式能匹配不包括 # 或空格字符的任何字符序列。 -