正则表达式快餐
正则表达式在开发时还是比较常用的,正则的使用可以说是灵活又复杂,本文以简单的例子说明常用的知识点。
/reg/g 需要匹配的字符串(reg)与模式(g)
常用的字符串方法
string.search(); // 返回匹配项的位置(首次出现位置的索引值)
string.replace("reg", "text"); // 替换匹配项的值
str.match(); // 返回匹配的字符串数组
参数可以是正则表达式也可以是字符串,字符串自动转化为正则表达式
常用的正则表达式方法
/reg/.text("str") // 有匹配的reg字符串时返回 true,没有则返回 false
/reg/.exec("str") // 返回匹配到的字符串,没有时返回 null
模式修饰符
借 Angelababy 来说明不同模式的区别
"Angelababy".replace(/a/, ""); // Angelbaby
i(ignore) 模式
不区分大小写
"Angelababy".replace(/a/i, ""); // ngelababy
g(global) 模式
全局匹配
"Angelababy".replace(/a/g, ""); // Angelbby
"Angelababy".replace(/a/gi, ""); // ngelbby
s(不知道英文是啥,感谢告知) 模式
es6 新增的 dot all 模式,以前 ‘.’ 在正则里表示匹配任意东西,但是不包括 \n,dotAll 模式中的 ‘.’ 将真正的匹配任何东西。
"Angelababy\nAngelababy".replace(/^A.*y$/, "*"); // 'Angelababy\nAngelababy' ** 不变,因为中间有换行符\n,. 匹配不到 **
"Angelababy\nAngelababy".replace(/^A.*y$/s, "*"); // *
m(multiline) 模式
多行匹配,修改^和$在正则表达式中的作用。在默认状态下,一个字符串无论是否换行只有一个开始^和结尾$,如果采用多行匹配,那么每一个行都有一个开始^和结尾$。
"Angelababy\nAngelababy".replace(/^A.*y$/, "*"); // 'Angelababy\nAngelababy' ** 不变,因为中间有换行符\n,. 匹配不到 **
"Angelababy\nAngelababy".replace(/^A.*y$/m, "*"); // "*\nAngelababy"
"Angelababy\nAngelababy".replace(/^A.*y$/gm, "*"); // "*\n*"
匹配修饰符
^ 匹配字符串开始位置
$ 匹配字符串结束位置
/^x.*handsomed$/ // 以x开头,handsomed结尾,中间有任意多个字符的字符串
/^x.*handsomed$/.test("xdx very handsomed") // true
n{X} X 个连着符合前面条件的字符串
n{X,Y} X-Y 个连着符合前面条件的字符串
n{X,} 至少 X 个连着符合前面条件的字符,越多越好
/x{2}/.test("x") // false
/x{2}/.test("xx") // true
"xxxxxxx".match(/x{2}/) // xx
"xxxxxxx".match(/x{2,4}/) // xxxx
"xxxxxxx".match(/x{2,}/) // xxxxxxx
n+ 一次或多次 (至少一次,贪心,越多越好)
n* 零次或多次 (有没有都行,贪心,越多越好)
n? 零或一次 (0 次或 1 次,多了也不要)
"xdxxxxxx".match(/xdx+/); // xdxxxxxx
"xdxxxxxx".match(/xdx*/); // xdxxxxxx
"xdxxxxxx".match(/xdx?/); // xdx
"xd".match(/xdx+/); // null
"xd".match(/xdx*/); // xd
"xd".match(/xdx?/); // xd
括号()和[],匹配一系列字符,一个括号只匹配一位
/[abc]/.exec("vscode") // c ** 符合其中abc之一即可 **
/[^abc]/.exec("vscode") // v ** 不符合abc之一即可 **
/[0-9]/.test(5) // true ** 符合区间即可,取反[^0-9] **
/(x|y)/.test("y") // 符合 x 或 y 其中之一即可
元字符,含有特殊含义的字符
字符 | 描述 |
---|---|
\d | 一个数字 |
\s | 一个空字符 |
\b | 在单词开头或结尾处寻找匹配项(单词边界) |
\w | 一个单词 |
\D,\S,\B | 功能相反 |
"adas abc as".match(/\sabc\s/); // " abc " ** 匹配abc包括前后的空格 **
"adas abc as".match(/\babc\b/); // "abc" ** \b只是匹配字符串开头结尾及空格回车等的位置, 不会匹配空格符本身 **
其他
- 若正则表达式中有变量,可以使用 new RegExp(sthVar)创建正则实例
- 使用\s\S \d\D \b\B 即可表示“全部”