正则表达式之 括号专题讲解

括号这个东东,直接使得正则表达式的能力提高了N个台阶。我们这就来看下括号的魅力。

一、首先是分组作用。将括号内的东东视为一个组即可(注意此时分组是可捕获的)

正则表达式为 /ab+/ 将会匹配到 abbbbbbbbb...

正则表达式 /(ab)+/ 将会匹配到 ababababab... 也就是ab作为了一个整体,一个组,量词加号作用于整个组

二、分支选择结构

正则表达式 /love (you|me)/ 将会匹配 I love you 也可以匹配 you love me 也就是括号内成为一个或机构,构成分支选择结构。

三、分组提取功能。(分组捕获)其实就是第一个的深度讲解

正则表达式为 /\d{4}-\d{2}-\d{2}/ 【\d匹配任意数字,花括号是集合的表示】

字符串为: “now ,time is 2017-09-19”

str.match(reg) 会匹配到结果 ["2017-09-19"]

如果我们稍作修改 加上括号如下

/(\d{4})-(\d{2})-(\d{2})/ 还是匹配上面一个字符串会有什么结果呢?

会得到["2017-09-19","2017","09","19"] 这样一个数组,也就是括号内的值将会被单独记录,并且输出到返回结果中。 返回的顺序是从左到右,遇到的每一组括号的位置。

该正则执行后,可以通过全局对象RegExp.$n 来获取相应的单个字符串。

image.jpeg

这种结果在正则表达式原理释义网站上状态为

image.jpeg
image.jpeg

细心的你会发现,这个分组提取都是从1开始提取的那么有没有0会返回一个undefined 哦!!! 那么问题又来啦, 如果本身只有3个分组 我去调用$4呢? 结果是null;

这里注意一个点: 在开启全局匹配的情况下, match 方法会只返回一个["2017-09-19"] (类似没有括号) 但是依然可以分组捕获各组数据。

image.jpeg

实例应用,找到字符串中的yyyy-mm-dd 并将其替换为dd/mm/yyyy格式

image.jpeg

这里知道下$n 可以直接作为replace的第二个参数就可以啦。

四、反向引用

括号使得正则可以在自身里通过 \n 引用之前的分组,但只能引用之前出现过的分组,即反向引用。

什么意思捏,举例说明一下:

正则表达式为: /(foo)(boo)/ 该表达式可以匹配出字符串“The HiFi RegExp fooboofooboo sadfoboasdf foo ajdhe boossdf” 中的fooboo(已经标蓝),那么我们如果更改一下将正则改为/(foo)(boo)\1\2/ 那么就会匹配出fooboofooboo 来, 这其中\1就是引用了第一个括号中的内容即foo,同理\2引用了(boo)

再来看时间的例子:

image.jpeg

我们来看下这个正则表达式的图解:

image.jpeg

那么问题来了,这种排列好的括号可以引用,括号嵌套怎么办呢?

这个跟捕获分组是一样的,是按照做括号的顺序来定义的。

image.jpeg

看例子可能有点迷惑,让我们看下其逻辑结构图:

image.jpeg

这样就比较稳了,什么样的分组,引用的谁,都是依靠左括号出现的顺序来定的,以后看到括号的正则表达式,也建议先推演画出简单的逻辑结构图,然后就很清晰了。

so,问题又来了, 如果出现\10 那么正则会把它当作 \10 还是\1后面跟一个0数字呢?

let us try!

image.jpeg

结果证实: \10是引用第10个分组,虽然真是引用中应该很少用到这个值。

那么最后的问题也来了,如果引用的组根本不存在呢?

Just be try ,when you find some question!

image.jpeg

答案这里就很明白了,引用不存在的分组,没啥作用,正则会把这个引用当作转义了的2来匹配,也就是会匹配到"\2",一定注意这里是转义后的2, 这种写法不能出现在严格模式的代码下,否则会报错,仅作实验可以。

四、非捕获分组

与一三作用相反,如果你并不想捕获分组,或者不想捕获某个分组,仅是想利用括号实现分组的概念,那么可以写为(?:x)的结构【x代表任意字符串】。

我们还是从实际例子出发:

/(?:ab){1,2}/ 匹配字符串中的ab 或者abab ; 这里花括号将作用域整个括号内部的字符串ab ,同时呢使用RegExp.$1 又不能得到任何东西。

image.jpeg
image.jpeg

然后可以看下一个括号的实际使用:

将字符串中的单词首字母都改为大写

image.jpeg

结果:

image.jpeg

其中涉及的点 除了这个非捕获分组 还有repalce() 方法的使用。 后面会讲解。然后这里的表达式 /(?:^|\s)\w/g 逻辑示意图是这样的:

image.jpeg

可以看到并不会出现 分组的虚线框!

有道云的链接:https://note.youdao.com/ynoteshare1/index.html?id=f0c63aee33bebc5027732818a4fcb805&type=note

你可能感兴趣的:(正则表达式之 括号专题讲解)