语法
正则表达式一种匹配模式:由普通字符和元字符组成。这里的普通字符包含:没有被指定为元字符的其他字符(包含非打印字符)。
非打印字符(8种)
非打印字符也可以是正则表达式的组成部分。下表列出了表示非打印字符的转义序列:
回车符:\r 换行符:\n 换页符(leaf):\f 制表符(tabulation):\t 垂直制表符(vertical):\v
任何空白字符(上述五个的集合体)(space):\s (\S : 任何非空白字符)
由X指明的控制符:\cx (例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。)
特殊字符(匹配特殊字符本身,该字符前添加 "\")(11种)
^ :①匹配开头 ②方括号中表示:不接受该字符集合
$ :匹配结尾
? :①匹配前边的子表达式 0/1 次 ②指明一个非贪婪限定符
+ :匹配前面的子表达式 1/多 次
* :匹配前面的子表达式 0/多 次
. :匹配除换行符:/n 之外的任意字符
():子表达式的开始结束
[ ]:中括号表达式的开始结束(多选一)
{} :限定符表达式的开始结束
| :两项之间的一个选择(二选一)
\ :将下一个字符标记为 ①特殊字符(如:\n)②原意字符(如:"\\")③向后引用 ④八进制转义符
限定符(6种)
作用:指定正则表达式的一个给定组件的 匹配次数
? :0/1 次(贪婪的)
* :0/多次(>=0次)(贪婪的)
+ :1/多次(>=1次)(贪婪的)
{n} :匹配确定的n次(n为非负整数)
{n, } :匹配至少n次
{n,m} :匹配n到m次之间(m,n为非负整数,且n < m )
贪婪匹配:匹配结果趋向于最大长度
非贪婪模式:匹配到就好,匹配长度尽量短
如何区分:默认为贪婪模式,在量词(限定符)后边加上?,就是非贪婪模式
量词(4种):? + * { n, m}
定位符
^ :①开始位置 ②如果设置了RegExp对象的Multiline属性,还会与\n \r 之后的位置匹配
$ :①结束位置 ②如果设置了RegExp对象的Multiline属性,还会与\n \r 之后的位置匹配
\b :匹配一个字边界,即字与空格间的位置(boundary)
\B :非字边界匹配
注意:限定符和定位点 不能同时使用
例子:①^ 和 $ 表示:文本的开头和结束处,如:/^Chapter [1-9][0-9]{0,1}$/ 匹配标题(以Chapter xx开头,并以Chapter xx结束)
②\b \B 表示:文本开头 和 单词开头(单词和空格之间的位置)例子:/ter\b/:以ter结束的单词;/\Bter/: 不以ter开头(匹配在中间或结尾)的单词
非捕获元
?; :匹配pattern但不获取匹配结果(非获取匹配),常与“|” 结合来组合一个模式的各个部分(如:industr(?:y|ies) 与 industry|industries作用等同 ),即可消除()引起的缓存副作用
?= :正向预查,在任何开始匹配()内正则表达式模式的位置来匹配搜索字符窜
?! :反向预查,在任何不匹配 该正则表达式模式的位置来匹配搜索字符串
选择
用()将 所有选择项括起来,相邻的选择项用 | 分割。
()的副作用:相关的匹配会缓存
具体:对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 '?:'、'?=' 或 '?!' 来重写捕获,忽略对相关匹配的保存。
反向引用
()的缓冲区可以使用 \n 来访问,
可以使用非捕获元字符,来重新捕获,忽略对相关匹配的保存。
常用场景:
①查找文本中两个相同的相邻单词
字符串:Is is the cost of of gasoline going up up?
字符串:/\b([a-z]+) \1\b/gi
结果:共找到 3 处匹配:
Is is
of of
up up
②将通用资源指示符 (URI) 分解为其组件
字符串:http://www.runoob.com:80/html/html-tutorial.html
正则表达式:/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
结果:
第一个括号子表达式包含"http"
第二个括号子表达式包含"www.runoob.com"
第三个括号子表达式包含":80"
第四个括号子表达式包含"/html/html-tutorial.html"
运算符优先级
\ :转义符
(), (?:), (?=),[] :圆括号、方括号
*,+,?{n}, {n,} ,{n,m} :限定符
^, $, \任何字符 :定位点、序列
| :替换 (字符比 | 的优先级高)