假设我有一个字符串:"We.need..to...split.asap"
。我想要做的是用分隔符.
分割字符串,但我只希望按第一个 .
拆分并包含任何定期.
在随后的令牌中。
预期产出:
["We", "need", ".to", "..split", "asap"]
在其他语言中,我知道这可以通过后视/(?<!\.)\./
实现,但遗憾的是,Javascript不支持这样的功能。
我很想知道你对这个问题的答案。也许有一种巧妙的使用前瞻,目前可以避开我?
我正在考虑扭转字符串,然后重新扭转代币,但这似乎对我所追求的东西太多了......加上争议:How do you reverse a string in place in JavaScript?
感谢您的帮助!
答案 0 :(得分:5)
以下是处理两个以上连续分隔符的the answer by guest271314变体:
var text = "We.need.to...split.asap";
var re = /(\.*[^.]+)\./;
var items = text.split(re).filter(function(val) { return val.length > 0; });
它使用详细信息,如果拆分表达式包含捕获组,则捕获的项目将包含在返回的数组中。这些捕获组实际上是我们唯一感兴趣的东西;标记都是空字符串,我们将其过滤掉。
编辑:不幸的是,这可能有一个小错误。如果要拆分的文本以分隔符开头,则将包含在第一个标记中。如果这是一个问题,可以通过以下方式解决:
var re = /(?:^|(\.*[^.]+))\./;
var items = text.split(re).filter(function(val) { return !!val; });
(我认为这个正则表达式很丑陋,欢迎改进。)
答案 1 :(得分:3)
你可以在没有任何前瞻的情况下做到这一点:
var subject = "We.need.to....split.asap";
var regex = /\.?(\.*[^.]+)/g;
var matches, output = [];
while(matches = regex.exec(subject)) {
output.push(matches[1]);
}
document.write(JSON.stringify(output));
&#13;
它似乎在一行中工作,就像在https://regex101.com/r/cO1dP3/1上一样,但必须在上面的代码中进行扩展,因为默认情况下/g
选项会阻止捕获组返回使用.match
(即正确的数据在捕获组中,但我们无法在不执行上述操作的情况下立即访问它们。)
请参阅:JavaScript Regex Global Match Groups
原始单线(加一条线)的替代解决方案是:
document.write(JSON.stringify(
"We.need.to....split.asap".match(/\.?(\.*[^.]+)/g)
.map(function(s) { return s.replace(/^\./, ''); })
));
&#13;
接受你的选择!
答案 2 :(得分:2)
注意:这个答案不能处理超过2个连续的分隔符,因为它是根据the revision 1 of the question中的示例编写的,对于这种情况并不是很清楚。
var text = "We.need.to..split.asap";
// split "." if followed by "."
var res = text.split(/\.(?=\.)/).map(function(val, key) {
// if `val[0]` does not begin with "." split "."
// else split "." if not followed by "."
return val[0] !== "." ? val.split(/\./) : val.split(/\.(?!.*\.)/)
});
// concat arrays `res[0]` , `res[1]`
res = res[0].concat(res[1]);
document.write(JSON.stringify(res));