JavaScript正则表达式详解(2)

当我们需要匹配三位数字时,我们可以这样:/\d\d\d/,但是当我们需要匹配10位或者更多时呢?考虑到这一点,正则表达式为我们提供了重复字符{ n, m },表示匹配前一项至少n次,但是不能超过m次。例如,刚才我们所说的匹配三位数字时,我们可以利用重复字符这样啦:/\d{3}/。

由于某些重复类型经常用到,so,正则规定一些特殊字符表示这些重复类型。

正则重复字符,详情见下:

字符

 

含义

 

例子

 

{n, m}

 

匹配前一项至少n次,但不能超过m次

 

/\d{2,3}/ 匹配"12"

 

{n, }

 

匹配前一项至少n次,或者更多

 

/\d{2, }/ 匹配"123"

 

{n}

 

匹配前一项恰好n次

 

/\d{2}/ 匹配"12"

 

 

匹配前一项0次或者1次,等价于{0,1}

 

/\d?/ 匹配"2"

 

+

 

匹配前一项1次或者多次,等价于{1, }

 

/\d+/ 匹配"12"

 

*

 

匹配前一项0次或者多次,等价于{0, }

 

/\d*/ 匹配"12"

 

另,以上重复字符重复规则为:尽可能多的匹配,即俗称的“贪婪匹配”,如:"aaaa".match(/a+/);匹配的就是整个字符串"aaaa",而不是匹配到第一个字符a时,就放弃匹配。

那么,有所谓的"贪婪匹配",就有"非贪婪匹配",它的规则嘛,肯定与"贪婪匹配"相反咯,即:尽可能少的匹配。

那么,怎么才能触发非贪婪模式呢?

只需要在重复字符后加入?,就ok啦,如({1, 4}?、+?等),如"aaaa".match(/a+?/);就只会匹配首个字符a咯。

注意,是尽可能少的匹配,而不是少的匹配哦。

神马意思?如下:

"aaab".match(/a*b/);

"aaab".match(/a*?b/);

!匹配结果都是"aaab"!

有没有点诧异,为什么"aaab".match(/a*?b/);的匹配结果会是"aaab",而不是"ab"呢?

那是因为正则匹配都是从左往右的,就"aaab".match(/a*?b/);而言,当遇到首字符a时,它会继续往下匹配,直到能符合匹配模式/a*?b/为止,这就是为什么说是尽可能少的匹配,前提是满足匹配规则

如"abbb".match(/ab*?/)的匹配结果就是"a"啦。

--字符 |( )(?: …)--

1.1、字符" | " 用于分隔,表示或。

什么意思?

举个栗子,如/ab | cd | ef/就可以匹配字符串"ab"或者"cd"或者"ef"。

是不是和字符类[ ]很像啊?

是的,如/a | b | c/和/[abc]/匹配效果是一样的哦。

But字符类[ ]仅针对单个字符而言,而分隔字符" | "涉及更广,可以针对多个字符而言,如上述所说的/ab | cd | ef/,字符类就不行咯。

你可能会说,如果我想对利用" | "组装的类进行多次匹配呢?

加个括号就是啦。如:

/(ab | cd |ef)+/

好滴,说到括号,我们再来看看它的作用。非常强大哦。

--------------------------------------分割线 --------------------------------------

Linux 基础入门教程----正则表达式基础   

Linux正则表达式sed 详述 

Linux正则表达式特性及BRE与ERE的区别

grep使用简明及正则表达式

正则表达式的用法

正则表达式之零宽断言

Linux中正则表达式与文件格式化处理命令(awk/grep/sed)

基础正则表达式

常用正则表达式整理

--------------------------------------分割线 --------------------------------------

1.2、括号"( )"

括号的作用如下:

  1、我们可以将一个单独的项目组合成一个子表达式,以便我们可以用|、*等来处理它。如,上诉所示的/(ab | cd | ef)+/

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5d19918dd526ad4205c6b4629fdfc463.html