正则表达式快餐

正则表达式在开发时还是比较常用的,正则的使用可以说是灵活又复杂,本文以简单的例子说明常用的知识点。

​/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 即可表示“全部”