解惑正则表达式中的捕获 |
您所在的位置:网站首页 › 在正则表达式中如何捕获匹配到的内容 › 解惑正则表达式中的捕获 |
读jQuery源码,其中不可避免的要弄明白正则表达式,在此对非捕获组(non-capturing)进行了一些梳理。 关于捕获的一些主要用法 (?:X) (?=X) (? 捕获要书明白捕获,就要先从分组开始。重复单字符我们可以使用限定符,如果重复字符串,用什么呢? 对!用小括号,小括号里包裹指定字表达式(子串),这就是分组。之后就可以限定这个子表示的重复次数了。 那么,什么是捕获呢?使用小括号指定一个子表达式后,匹配这个子表达式的文本(即匹配的内容)可以在表达式或者其他过程中接着用,怎么用呢?至少应该有个指针啥的引用它吧? 对!默认情况下,每个分组(小括号)会自动 拥有一个组号,从左到右,以分组的左括号为标志,第一个出现的分组组号为1,后续递增。如果出现嵌套, 例如: “aabcd” 采用正则 (a(b))(c) match 结果入下: 分组捕获 $1(group1) ab $2(group2) b $3(group3) c继续涨姿势。 一、(?:)非捕获组走起。 由下面一个例子引发对非捕获组的学习。 有两个金额:6000¥ 和 1000$。 需求是得到金额和货币种类。 『废话少说,多用正则』: (\d+)+([$¥]) 输出结果为: OK,满足了要求。这里的正则分成了两个组,一个是(d+),一个是(¥$),前一个组($1)匹配金额,后一个组($2)匹配货币种类。 现在,需求变了!! 我需要这个正则同时可以匹配浮点数小数点前面的整数。如10010.86¥,提炼出 10010 和 ¥。 那么正则如下: (\d+)(\.?)(\d)([$¥])这里用括号分了四组,所以要输出金额的整数部分和种类,要分别输了$1,$4了。如果输出部分和正则是分开的,我希望只修改正则而不去修改输出部分的代码,也就是还是用$1,$2作为输出。由此可以引出非捕获组(?:)。 把前面的正则修改为: (\d+)(?:\.?)(?:\d+)([¥$])$这样,还是用$1,$2做为输出,同样输出了 10010 和 ¥ 这个正则的中间两个组用到的就是非捕获组(?:),它可以理解为只分组而不捕获。 二、(?=)和(?那么意义刚好也是相反的。 [0-9a-z]{2}(?!aa)意思是:匹配两个字符,且后面紧跟着的不是aa (?意思是:匹配两个字符,且前面紧跟着的不是aa 用法和前面讲的差不多,这里不再详述。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |