js正则表达式

正则表达式在我们工作中经常会使用到,一个好的正则表达式会让我们少些很多代码,而且效率还很高,但是很多时候在遇到校验的时候都会先去百度一波,直接拷贝过来,往往在百度的时候会出现各种各样的答案,不知道选哪个好,这时我们就需要学习一下正则,方便我们去选择最合适的方案。

一、正则表达式语法

1、普通字符

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

2、非打印字符

\cx(由x指明的控制字符),\f(换页符),\n(换行符),\r(回车符),\s(空白字符),\S(非空白字符),\t(制表符),\v(垂直制表符)

3、特殊字符

许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符\ 放在它们前面。
如:$,(),*,+,.,[],?,\,^,{},|

4、限定字符

*,+,?,{n},{n,},{n,m}
限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。例如:
*?,+?,??,{n}?,{n,}?,{n,m}?

var str = '<a>abc</a>';
var regexp = /<.*>/;
str.match(regexp);

// ["<a>abc</a>", index: 0, input: "<a>abc</a>", groups: undefined]
var str = '<a>abc</a>';
var regexp = /<.*?>/;
str.match(regexp);

// ["<a>", index: 0, input: "<a>abc</a>", groups: undefined]

5、定位符

^,$,\b,\B

6、选择符

[],|

var str = 'abc bbc cbd dbc ebc';
var reg = /\b[abc]\w*\b/g;
str.match(reg);

// ["abc", "bbc", "cbd"]

7、反向引用

对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 \n 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

var str = '"abc"\'def\'"ghi\'';
var reg = /['"]\w+['"]/g;
str.match(reg)

// [""abc"", "'def'", ""ghi'"]
var str = '"abc"\'def\'"ghi\'';
var reg = /(['"])\w+\1/g;
str.match(reg)

//  [""abc"", "'def'"]

8、非捕获元字符

?:,?=(正向预查),?!(反向预查)

var str = 'windows 98 is ok';
var reg = /windows (\d+)/;
str.match(reg);

//  ["windows 98", "98", index: 0, input: "windows 98 is ok", groups: undefined]

var str = 'windows 98 is ok';
var reg = /windows (?:\d+)/;
str.match(reg);

// ["windows 98", index: 0, input: "windows 98 is ok", groups: undefined]

var str = 'windows 98 is ok';
var reg = /windows (?=\d+)/;
str.match(reg);

// ["windows ", index: 0, input: "windows 98 is ok", groups: undefined]

var str = 'windows 98 is ok';
var reg = /windows (?!\d+)/;
str.match(reg);

// null

var str = 'windows a98 is ok';
var reg = /windows (?!\d+)/;
str.match(reg);

// ["windows ", index: 0, input: "windows a98 is ok", groups: undefined]

9、其余常用元字符

\d(数字字符),\D(非数字字符),\w(字母、数字、下划线),\W(非字母、数字、下划线)

 

二、正则表达式的后缀

g: 表示执行全局匹配

i: 表示匹配时不区分大小写

m: 表示采用多行模式匹配(在多行模式下,^ 表示一行的开头或者字符串的开头,$ 表示一行的结尾或者字符串的结尾)

var str  = 'a0c\na1c';
var reg = /^a\dc$/g;
str.match(reg)

// null

var str  = 'a0c\na1c';
var reg = /^a\dc$/gm;
str.match(reg)

// ["a0c", "a1c"]

 

三、正则表达式的运算符优先级

正则表达式从左到右进行计算,并遵循优先级顺序。

运算符优先级从高到低一次为:

\
(), (?:), (?=), []
*, +, ?, {n}, {n,}, {n,m}
^, $, \任何元字符,任何字符
|
var str = 'abc bbc cbc dbc ebc';
var reg = /\ba|b|c\w*?\b/g;
str.match(reg)

//  ["a", "b", "c", "b", "b", "c", "cbc", "b", "c", "b", "c"]

var str = 'abc bbc cbc dbc ebc';
var reg = /\b(a|b|c)\w*?\b/g;
str.match(reg)

// ["abc", "bbc", "cbc"]

 

四、正则表达式相关的方法

1、RegExpObject.test(string)

用于检测一个字符串是否匹配某个模式

返回值:如果字符串 string 中包含有与 RegExpObject 匹配的文本,则返回 true, 否则返回 false。

2、RegExpObject.exec(string)

用于检索字符串中的正则表达式的匹配

返回值:返回一个数组,其中存放匹配的结果。如果未找到匹配项,则返回 null。在调用非全局的 RegExp 对象的 exec() 方法时,返回的数组与调用方法 String.match() 返回的数组是相同的。但是,当 RegExpObject 是一个全局正则表达式时,exec() 的行为就稍微复杂一些。

 使用exec 检索字符串,如果添加全局标识 g,需要注意 lastIndex,每次匹配到之后会返回当前匹配的最后一个字符index  + 1 位置,下次匹配的时候会从index + 1 位置开始匹配,知道匹配介绍,lastIndex重新置为0

var str = 'a0ba1ba3ba4bs';
var regexp = /a\db/g
var res = regexp.exec(str);
console.log(res);
console.log(regexp.lastIndex);

// ["a0b", index: 0, input: "a0ba1ba3ba4bs", groups: undefined]
// 3

res = regexp.exec(str);
console.log(res);
console.log(regexp.lastIndex);

// ["a1b", index: 3, input: "a0ba1ba3ba4bs", groups: undefined]
// 6

res = regexp.exec(str);
console.log(res);
console.log(regexp.lastIndex);

// ["a3b", index: 6, input: "a0ba1ba3ba4bs", groups: undefined]
// 9

res = regexp.exec(str);
console.log(res);
console.log(regexp.lastIndex);

// ["a4b", index: 9, input: "a0ba1ba3ba4bs", groups: undefined]
// 12

res = regexp.exec(str);
console.log(res);
console.log(regexp.lastIndex);

// null
// 0

3、string.search(RegExpObject)

用于检索与正则表达式相匹配的子字符串。
返回值:stringObject 中第一个与 regexp 相匹配的子串的起始位置。如果没有找到任何匹配的子串,则返回 -1。

4、string.replace(RegExpObjec, replacement)

用于在字符串中用一些字符替换一个与正则表达式匹配的子串。
replacement参数:替换文本或生成替换文本的函数。
返回值:一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。

当replacement 为文本时,$ 具有特殊含义

$1、$2、...、$99:与 regexp 中的第 1 到第 99 个子表达式相匹配的文本。
$&:与 regexp 相匹配的子串。
$`:位于匹配子串左侧的文本。
$':位于匹配子串右侧的文本。
$$:直接量符号。

var str = 'a0ba1ba3ba4bs';
var regexp = /a(\d)b/g;
str.replace(regexp, 'z$1z');

// "z0zz1zz3zz4zs"

replacement是函数时,该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。

var str = 'a0ba1b';
var regexp = /a(\d)b/g;
str.replace(regexp, (match, sub1, index, oldStr) => {
    console.log(match);
    console.log(sub1);
    console.log(index);
    console.log(oldStr);
    return `z${sub1}z`;
});

// a0b
// '0'
// 0
// a0ba1b
// a1b
// '1'
// 3
// a0ba1b
// "z0zz1z"

5、string.match(RegExpObject)

可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。
返回值:存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。

var str = 'a0ba1ba2ba3b';
var regexp = /a(\d)b/;
str.match(regexp);

// ["a0b", "0", index: 0, input: "a0ba1ba2ba3b", groups: undefined]

var str = 'a0ba1ba2ba3b';
var regexp = /a(\d)b/g;
str.match(regexp);

// ["a0b", "a1b", "a2b", "a3b"]

6、string.split(RegExpObject, howmany)

用于把一个字符串分割成字符串数组。
返回值:一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 separator 自身。但是,如果 separator 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。

var str = 'a0ba1ba2ba3b';
var regexp = /\d/g;
str.split(regexp)

// ["a", "ba", "ba", "ba", "b"]

var str = 'a0ba1ba2ba3b';
var regexp = /(\d)/g;
str.split(regexp)

// ["a", "0", "ba", "1", "ba", "2", "ba", "3", "b"]

 

posted on 2019-09-23 13:59  sjpqy  阅读(260)  评论(0编辑  收藏  举报

导航