Firefox中的负向后看

时间:2019-06-13 17:27:39

标签: javascript regex

我刚刚了解了难于解决的问题,即Firefox不支持负向后看。刚刚部署到生产中,一切似乎都很好。一旦我们的Firefox用户开始点击它,他们一无所有。

此正则表达式是否有补填或其他替代方法?

"Item 1, Item2^, Item2a, Item3".split(/(?<!\^),/)

我正在尝试用逗号而不是^,

将字符串拆分为数组

“项目1,项目2 ^,项目2a,项目3”

应该以

结尾
[
"Item 1",
"Item2^, Item2a",
"Item3"
]

2 个答案:

答案 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是您想要的