JavaScript按正向拆分字符串

时间:2019-06-24 18:21:09

标签: javascript regex

我正在尝试拆分包含分界符的字符串,例如

  • "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

提出我的问题:

  1. 代码合法吗?
  2. 如何使其在Firefox和Edge中运行?

3 个答案:

答案 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。