我正在尝试拆分包含分界符的字符串,例如
"a/b/c"
将成为["a/", "b/", "c"]
"a//b"
将成为["a/", "/", "b"]
var s = "a/b/c".split(/(?<=\/)/);
console.log(s); // prints ["a/", "b/", "c"]
它在Chrome中运行正常,但Firefox表示:SyntaxError: invalid regexp group
提出我的问题:
答案 0 :(得分:3)
我认为Firefox还不支持回溯。相反,您可以使用捕获组进行拆分以保留定界符,匹配组中所有非正斜杠的先前字符,然后进行过滤以删除空字符串。例如:
let s = 'a/b/c'.split(/([^/]*\/)/).filter(x => x);
console.log(s);
// ["a/", "b/", "c"]
let s = 'a//b'.split(/([^/]*\/)/).filter(x => x);
console.log(s);
// ["a/", "/", "b"]
答案 1 :(得分:1)
(a)似乎大多数浏览器尚不支持向后搜索; Chrome是少数这样做的公司之一(截至2019年6月) [来源:http://kangax.github.io/compat-table/es2016plus/#test-RegExp_Lookbehind_Assertions]
(b)我倾向于将其简单地除以/\//
,并知道除最后一个元素外的每个元素都应“确实”以斜杠结尾。 "a/b//c//".split(/\//)
返回["a","b","","c","",""]
。
(c)您也可以对“斜杠”进行match
(而不是split
),然后加上0或更多的非斜杠:"a/b//c//".match(/[^\/]*\//g)
返回{{1 }}。
顺便说一句,请务必在以“ /”开头的字符串上测试您的解决方案(大概应该只返回["a/","b/","/","c/","/"]
作为第一个元素)。
答案 2 :(得分:0)
我不知道为什么该功能在其他浏览器中不起作用。但是您可以对replace
使用以下技巧:
var text = 'a/b/c';
var splitText = text
.replace(new RegExp(/\//, 'g'), '/ ') // here you are replacing your leading slash `/` with slash + another symbol e.g. `/ `(space is added)
.split(' ') // to further split with added symbol as far as they are removed when splitting.
console.log(splitText) // ["a/", "b/", "c"]
通过这种方式,您可以避免使用在FireFox,Edge等中无法使用的复杂regExp。