个人学习记录,仅供参考
教程网站: https://www.runoob.com/regexp/regexp-syntax.html
语法:
普通字符:
[ABC] : 表示匹配括号中的所有字符
[^ABC] : 表示匹配除A、B、C外的所有字符
[A-Z] : 表示匹配A至Z的所有大写字母
\d : 匹配数字
\D : 匹配非负数
. : 表示匹配除换行符(\n、\r)外的所有字符
\s : 匹配所有空白符,包括换行
\S : 匹配所有非空白符,包括换行
\w : 匹配字母、数字及下划线,等价于[A-Za-z0-9_]
\W : 匹配非字母、数字及下划线,等价于[^A-Za-z0-9]
非打印字符:
\cx : 表示匹配 CTRL + x 或 回车符
\f : 表示匹配 换页符
\n : 表示匹配一个换行符
\r : 表示匹配一个回车符
\t : 表示一个制表符
\v : 表示一个垂直制表符
\s : 匹配所有空白字符,等价于[\f\n\r\t\v]
\S : 匹配所有非空白字符,等价于[^\f\n\r\t\v]
特殊字符:
^ : 匹配输入字符串的开始位置
$ : 匹配输入字符串的结尾位置
() : 标记子表达式的开始和结束
* : 匹配前面的子表达式零次或多次
+ : 匹配前面的子表达式一次或多次
. : 匹配除换行符以为的所有单字符
? : 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
\ : 用作转义
| : 两者间的一个选择,或的意思
限定符: 用来指定正则表达式需要出现多少次匹配
* : 匹配前面的子表达式零次或多次
+ : 匹配前面的子表达式一次或多次
? : 匹配前面的子表达式零次或一次
{n} : 匹配前面的子表达式n次
{n,} : 匹配前面的子表达式至少n次
{n, m} : 匹配前面的子表达式至少n次最多m次
注意: * 和 + 限定符都是贪婪的,因为它们会尽可能多的匹配文字即最大匹配,在它们的后面加上一个 ? 就可以实现最小匹配
eg: <h1>luogeng</h1>
正则表达式为 <.*>则匹配到的是<h1>luogeng</h1>全文
若正则表达式为<.*?>则匹配到的是<h1>和</h1>
定位符:
^ : 匹配输入字符串的开始
& : 匹配输入字符串的结尾
\b : 匹配一个单词的边界,\b在表达式左边则匹配左边界的,\b在表达式右边则匹配单词的右边
\B : 非单词边界匹配,需要看\B在表达式左边还是右边,即在左边,不匹配左边界,在右边不匹配右边界,和\b恰好相反
eg: 字符串abcde 表达式 \Babc 不能匹配到, 而 abc\B 则能匹配到, 表达式 \Bcde 能匹配到, 而cde\B 不能匹配到
() : 表示选择时,选择项间用 | 分割, 也可表示分组,即分成数组,索引0对应的是整个字符串,索引1对应第一个匹配符(括号内),以此类推
eg: 分组作用
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++) {
console.log(arr[i]);
}
输出:
http
www.runoob.com
80
/html/html-tutorial.html
?=、?<=、?!、?<! :
?= : exp1(?=exp2) 查找后面是exp2的exp1
eg: luo(?=[\d]) 匹配数字前面的luo
?<= : (?<=exp2)exp1 查找前面是exp2的exp1
eg: (?<=[\d])luo 匹配数字后面的luo
?! : exp1(?!exp2) 查找后面不是exp2的exp1
eg: luo(?![\d]) 匹配非数字前面的luo
?<= : (?<!exp2)exp1 查找前面不是exp2的exp1
eg: (?<![\d])luo 匹配非数字前面的luo
修饰符: i g m s
i : 不区分大小写
g : 全局匹配
m : 多行匹配
s : 特殊字符圆点 . 中包含换行符\n
运算符优先级:
\ : 转义字符
()、(?:)、(?=)、(?!)、[] : 圆括号和方括号
^、&、\b、\B、任意字符 : 定位符和顺序
| : 或