为了账号安全,请及时绑定邮箱和手机立即绑定

用正则匹配class时引出的一个疑惑?

用正则匹配class时引出的一个疑惑?

慕仙森 2019-04-19 16:29:35
在用正则匹配一个特定的className时,发现了一个问题,在此请教一下大家:比如,一个元素的完整的className是varf="acp1p4p0fep6p8p9p10p11ap7p3dp12";我想写一个正则能匹配出全部只能由"p"+数字组合的class。我自己写的一个正则如下:varreg=/(?:\s+|^)p\d+(?:\s+|$)/g;结果是:["p1","p0","p6","p9","p11","p12"]发现其中少匹配了p4p8p10这里颇为费解,后来我发现规律是相邻的多个“p数字”只会间隔着匹配到!我分析是因为:前面一个满足条件的匹配项,比如p1,它占据匹配到的前后空格,导致本来符合正则的紧邻的匹配项p4因为p1匹配项以及占据了后空格(即是后面的匹配项p4的前空格),导致p4自己不符合正则表达式的匹配了而导致匹配不到的。然后我修改正则为varreg=/(?:\s+?|^)p\d+(?:\s+?|$)/g;增加了一个最小匹配"?"这是原字符串:varf="acp1p4p0fep6p8p9p10p11ap7p3dp12";现在的正则结果变为,["p1","p4","p0","p6","p8","p9","p11","p12"]结果匹配的比之前多了,但是还是没有全部匹配到,其中少了p10分析发现第2个正则,对于匹配2个挨着的“p数字”之间只有1个空格的情况,会出现上述丢失的问题。间隔有1个空格以上可以全部匹配到。那么问题来了,正确的正则匹配上述要求应该如何写?对于第一种正则,它失配的原因到底怎么理解呢?我一直以为第一个正则是能匹配得到的望大神指点一二!!在此感激不尽!
查看完整描述

2 回答

?
慕尼黑8549860

TA贡献1818条经验 获得超11个赞

想复杂了吧?直接用\bp\d+\b就可以了。
补充:第一个正则失败是因为p1后面的空格被p1匹配了,到了匹配p4时,导致p4前面没有空格而匹配失败(因为(?:\s+|^)用了+),其他的类似。
                            
查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 440 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信