JavaScript。使用.match(正则表达式)拆分字符串

时间:2016-06-15 14:37:57

标签: javascript regex split

从Mozilla开发者网络获取功能split()

  

split()方法返回新数组。

     

找到后,将从字符串和子字符串中删除分隔符   以数组形式返回。如果找不到分隔符或被省略,则   数组包含一个由整个字符串组成的元素。如果   separator是一个空字符串,str被转换为一个数组   字符。

     

如果separator是包含捕获的正则表达式   括号,然后每次分隔符匹配,结果   捕获括号的(包括任何未定义的结果)是   拼接到输出数组中。但是,并非所有浏览器都支持此功能   能力。

采用以下示例:

var string1 = 'one, two, three, four';
var splitString1 = string1.split(', ');
console.log(splitString1); // Outputs ["one", "two", "three", "four"]

这是一种非常干净的方法。我尝试使用正则表达式和稍微不同的字符串:

var string2 = 'one split two split three split four';
var splitString2 = string2.split(/\ split\ /);
console.log(splitString2); // Outputs ["one", "two", "three", "four"]

这与第一个例子一样有效。在下面的示例中,我再次更改了字符串,使用了3个不同的分隔符:

var string3 = 'one split two splat three splot four';
var splitString3 = string3.split(/\ split\ |\ splat\ |\ splot\ /);
console.log(splitString3); // Outputs ["one", "two", "three", "four"]

然而,正则表达式现在变得相对凌乱。我可以对不同的分隔符进行分组,但结果将包括这些分隔符:

var string4 = 'one split two splat three splot four';
var splitString4 = string4.split(/\ (split|splat|splot)\ /);
console.log(splitString4); // Outputs ["one", "split", "two", "splat", "three", "splot", "four"]

所以我尝试在离开组时从正则表达式中删除空格,但没有多大用处:

var string5 = 'one split two splat three splot four';
var splitString5 = string5.split(/(split|splat|splot)/);
console.log(splitString5);

虽然,当我删除正则表达式中的括号时,分隔符在分割字符串中消失了:

var string6 = 'one split two splat three splot four';
var splitString6 = string6.split(/split|splat|splot/);
console.log(splitString6); // Outputs ["one ", " two ", " three ", " four"]

另一种方法是使用match()来过滤掉分隔符,除非我真的不了解反向前瞻是如何工作的:

var string7 = 'one split two split three split four';
var splitString7 = string7.match(/((?!split).)*/g);
console.log(splitString7); // Outputs ["one ", "", "plit two ", "", "plit three ", "", "plit four", ""]

它与整个单词不匹配。说实话,我甚至不知道这里到底发生了什么。

如何在不使用结果中的分隔符的情况下使用正则表达式正确分割字符串?

2 个答案:

答案 0 :(得分:14)

使用非捕获组作为拆分正则表达式。通过使用非捕获组,拆分匹配将不包含在结果数组中。

var string4 = 'one split two splat three splot four';
var splitString4 = string4.split(/\s+(?:split|splat|splot)\s+/);
console.log(splitString4);

// Output => ["one", "two", "three", "four"]

答案 1 :(得分:1)

如果您想使用match,可以像

一样编写
'one split two split three split four'.match(/(\b(?!split\b)[^ $]+\b)/g)
["one", "two", "three", "four"]

它的作用是什么?

  • \b匹配字边界

  • (?!split\b)向前看负面,检查单词是否 split

  • [^ $]+匹配空格以外的任何内容或$,字符串结尾。此模式将匹配单词,前瞻确保匹配的内容不是split

  • \b匹配单词end。