如何通过不直接在相同类型的字符前面的字符拆分字符串?

时间:2015-06-03 02:09:44

标签: javascript regex

假设我有一个字符串:"We.need..to...split.asap"。我想要做的是用分隔符.分割字符串,但我只希望按第一个 .拆分并包含任何定期.在随后的令牌中。

预期产出:

["We", "need", ".to", "..split", "asap"]

在其他语言中,我知道这可以通过后视/(?<!\.)\./实现,但遗憾的是,Javascript不支持这样的功能。

我很想知道你对这个问题的答案。也许有一种巧妙的使用前瞻,目前可以避开我?

我正在考虑扭转字符串,然后重新扭转代币,但这似乎对我所追求的东西太多了......加上争议:How do you reverse a string in place in JavaScript?

感谢您的帮助!

3 个答案:

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

你可以在没有任何前瞻的情况下做到这一点:

&#13;
&#13;
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;
&#13;
&#13;

它似乎在一行中工作,就像在https://regex101.com/r/cO1dP3/1上一样,但必须在上面的代码中进行扩展,因为默认情况下/g选项会阻止捕获组返回使用.match(即正确的数据在捕获组中,但我们无法在不执行上述操作的情况下立即访问它们。)

请参阅:JavaScript Regex Global Match Groups

原始单线(加一条线)的替代解决方案是:

&#13;
&#13;
document.write(JSON.stringify(
    "We.need.to....split.asap".match(/\.?(\.*[^.]+)/g)
        .map(function(s) { return s.replace(/^\./, ''); })
));
&#13;
&#13;
&#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));