如何在现有正则表达式中添加负向预查以匹配首个冒号?
解决正则匹配贪婪模式问题
你的问题根源是正则里的.*属于贪婪量词,会尽可能匹配最长的内容,所以从#+之后一直匹配到最后一个:,导致第一个捕获组不符合预期。下面给两种可行的解决方法:
方法1:使用非贪婪量词
把第一个捕获组的.*改成.*?(非贪婪模式,尽可能匹配最短内容),正则表达式如下:
^#\+(.*?): *(.*)$
.*?会在遇到第一个:时停止匹配,这样第一个捕获组就能得到foo,第二个捕获组得到bar: lore。
方法2:使用否定字符集
直接匹配不含冒号的字符,效率更高(无需回溯),正则表达式:
^#\+([^:]*): *(.*)$
[^:]*表示匹配任意数量的非冒号字符,自然会在第一个:处停止,完全符合你“#+之后到第一个:之前的所有内容”的需求。
为什么你的负向预查写法无效?
你写的.*(?!:)逻辑有问题:.*依然是贪婪匹配,会先把所有能匹配的内容都吃掉,再检查最后一个字符后面是否没有:——而原字符串末尾本来就没有:,所以这个预查条件会被满足,根本起不到限制匹配到第一个:的作用。负向预查在这里不是正确的思路,上述两种方法更直接有效。
内容的提问来源于stack exchange,提问作者buhtz
相关产品推荐
相关产品推荐

