PCRE2(PHP>=7.3)正向预查正则提取目标内容的问题
PCRE2(PHP>=7.3)正向预查正则提取目标内容的问题
嘿,我来帮你搞定这个正则提取的问题!先理清楚你的核心需求:要从开头固定是newProductsInfo: 加数组的字符串里,把数组里的条目拆出来,而且得区分开作为分隔符的逗号(后面跟空格)和条目内部的逗号(后面没空格),像[4]Same, [5]Value这种就得完整提取出来对吧?
你之前用的(?<=newProductsInfo: \[)[^,\]]+为啥只拿到[1呢?因为[^,\]]+是匹配“不是逗号也不是右括号的字符”,一碰到第一个逗号就停了,根本没法区分哪种逗号是分隔符,这思路得调整~
给你个能直接用的PCRE2正则:
(?<=newProductsInfo: \[)(?:[^,\]]+|,(?! ))+(?=, |\])
我给你拆解下每个部分的作用,方便你理解:
(?<=newProductsInfo: \[):正向预查,确保我们的匹配是从newProductsInfo: [之后开始的,不会匹配到前面的无关内容(?:[^,\]]+|,(?! ))+:这是个非捕获组,用来重复匹配两种情况:[^,\]]+:匹配任意不是逗号、不是右括号的字符,也就是条目里的正常内容,(?! )):匹配后面不跟空格的逗号——也就是条目内部的逗号,不能当成分隔符的那种
(?=, |\]):正向预查,确保我们的匹配结束在“逗号+空格”(下一个条目的分隔符)或者右括号(数组的结尾)
你去Regex101里选PCRE2(PHP>=7.3)引擎测试的话,就能得到你想要的四个结果:
[1] - $2 dollars[2] New Product[3] Hello[4]Same, [5]Value
要是你之后遇到类似的“区分特定分隔符”的正则问题,这个“用负向预查排除非分隔符”的思路也能复用哦!
备注:内容来源于stack exchange,提问作者Prosy A.
相关产品推荐
相关产品推荐

