问答

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

作者:admin 2021-09-24 我要评论

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

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

. 元字符用于查找单个字符,除了换行和行结束符。
*元字符用于匹配它前面的单个字符零次或者多次。
(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/);

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

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

###

模式为: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

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

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

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

  • 线程中创建的实例对象也必然是线程共享

    线程中创建的实例对象也必然是线程共享

  • 元素 height : auto 时,是不支持 CSS3

    元素 height : auto 时,是不支持 CSS3

  • 如何优雅的管理组件状态?

    如何优雅的管理组件状态?

腾讯云代理商
海外云服务器