关于正则表达式,.*组合使用问题

. 元字符用于查找单个字符,除了换行和行结束符。
*元字符用于匹配它前面的单个字符零次或者多次。
(1)模式为:B.*Forta ,字符串BForta可以被匹配到

    let str = 'BForta';
    str.match(/B.*Forta/);

疑问点:这里.*到底是匹配到什么?

    let str = 'Ben Forta';
    str.match(/B.*Forta/);

疑问点:这里.*匹配到什么?
(2)模式为:B.* Forta ,字符串Ben Forta可以被匹配到

    let str = 'Ben Forta';
    str.match(/B.* Forta/);

疑问点:这里的.*又是匹配到什么?

一直没想明白 .元字符只是匹配除换行和结束符的单个字符,它后面的*元字符也只是匹配.匹配到的那个单字符的基础上匹配零次或者多次。
为啥上面的三种情况,.*可以匹配到?希望可以单独解释下它们两个分别匹配到什么?

阅读 2.4k
3 个回答

模式为:B.*Forta ,字符串BForta可以被匹配到

当字符串为BForta时,.*只是匹配到了B后面的那个位置;当字符串为Ben Forta时,.*匹配到的是'en ',你加个分组就可以看到它匹配到的内容了

在线工具解析:
zz.png

代码解析:

'BForta'.match(/B(.*)Forta/);
'Ben Forta'.match(/B(.*)Forta/);

zzz.png


模式为:B.* Forta ,字符串Ben Forta可以被匹配到

当此时字符串为'Ben Forta'时,.*匹配到的是'en',你可以加个分组查看

在线工具解析:
k.png

代码解析:

'Ben Forta'.match(/B(.*) Forta/);

kk.png

总结:

因为.*相当于.{0,},也就是.*是可以匹配0次的,此时它可以匹配一个位置而已。但.*又是贪婪的,它会竟可能的去匹配,至于最后能匹配多少字符,是要跟它后面的其他子表达式去协调匹配,协调的过程就是回溯的过程,这个回溯你理解了,就明白了

.就是任意字符,*就是任意次数,*并不是前一个匹配“字符”的重复,而是匹配“模式”的重复。

它后面的\*元字符也只是匹配.匹配到的那个单字符的基础上匹配零次或者多次。这句话是错误的。

就拿斗地主来比喻,你手上有三张癞子牌,你使用其中一个当作5,但是另外两张癞子不是被锁定为5的。

第一个案例,是*在起作用,他为0,匹配到的是空字符串

第二个案例,.匹配到了e、n和空格

第三个案例,.匹配到了e、n

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题