我正在尝试将字符串拆分为数组,并且我希望使用以下格式恢复数组:['a','b', 'c']
const code = "/*_ ex1.js */a/*_ ex2.js */b/*_ ex3.js */c"
code.split(/\/\*_.+?\*\//)
=> (这就是我想要的)
['a','b', 'c']
但是当我尝试确保正则表达式适用于新行
时code.split(/\/\*_(.|\s)+?\*\//)
=>(不是我想要的)
[' ', 'a', ' ', 'b', ' ', 'c']
我不知道这些额外的空间来自哪里。它显然与括号中的捕获组有关,但我不明白如何解决这个问题。
答案 0 :(得分:2)
split
包含输出中任何捕获组的内容。来自MDN:
如果separator是包含捕获括号的正则表达式,则每次匹配时,捕获括号的结果(包括任何未定义的结果)都会拼接到输出数组中。
在您的情况下,(.|\s)
是一个捕获组。因此,空格将包含在您的输出中。解决此问题的最简单方法是使其成为具有?:
的非捕获组:
code.split(/\/\*_(?:.|\s)+?\*\//)
^^
这仍然会在结果数组中留下一个初始的空字符串。 (你的初始非多行版本也表现得那样。)没有办法解决这个问题,因为你的分割器正好在字符串的开头,因此左边的标记是一个空字符串。如果你想摆脱它,你可以过滤掉它:
.filter(Boolean)
答案 1 :(得分:0)
尝试使用String.prototype.match()
与RegExp
/[a-z](?=\/|\n|$)/g
匹配字符类a
到z
后跟/
字符或换行符或结尾输入
const code = "/*_ ex1.js */a/*_ ex2.js */b/*_ ex3.js */c\n"
+ "/*_ ex4.js */d/*_ ex5.js */e/*_ ex6.js */f";
var res = code.match(/[a-z](?=\/|\n|$)/g);
console.log(res);