我刚刚了解了难于解决的问题,即Firefox不支持负向后看。刚刚部署到生产中,一切似乎都很好。一旦我们的Firefox用户开始点击它,他们一无所有。
此正则表达式是否有补填或其他替代方法?
"Item 1, Item2^, Item2a, Item3".split(/(?<!\^),/)
我正在尝试用逗号而不是^,
“项目1,项目2 ^,项目2a,项目3”
应该以
结尾[
"Item 1",
"Item2^, Item2a",
"Item3"
]
答案 0 :(得分:3)
如评论中所述,JS不支持旧的EmcaScript版本中的回溯。
新版本(我认为确实支持6)。
无论如何,您可以做的是找到符合您需要的所有正则表达式。
找到/\s*((?:(?!\s*(?:,|$))[^,\^])*(?:\^,?(?:(?!\s*(?:,|$))[^,\^])*)*)\s*,?\s*/g
每次匹配时元素在捕获组1中的位置。
请注意,此正则表达式会进行空格修整,否则将非常小。
可读正则表达式
\s*
( # (1 start)
(?:
(?! \s* (?:,|$) )
[^,\^]
)*
(?:
\^,?
(?:
(?! \s* (?:,|$) )
[^,\^]
)*
)*
) # (1 end)
\s*
,?
\s*
JS演示
var arr = [];
var str = "Item 1, Item2^, Item2a, Item3 ,,, ii , kkk ";
var re = /\s*((?:(?!\s*(?:,|$))[^,\^])*(?:\^,?(?:(?!\s*(?:,|$))[^,\^])*)*)\s*,?\s*/g;
str.replace( re, function( m, grp1 ) {
arr.push( grp1 );
});
console.log( arr );
答案 1 :(得分:2)
作为替代方案,总有适合您的旧的“双重替代”:
r = "Item 1, Item2^, Item2a, Item3"
.replace(/,/g, '~')
.replace(/\^~/g, '^,')
.split(/~ /g)
console.log(r)
基本上,/(?<! X) Y/
被“展开”为三个步骤:
Y
=> temp
X temp
替换为X Y
temp
是您想要的