在JS中拆分字符串

时间:2015-06-17 15:33:33

标签: javascript regex

我需要拆分一个字符串,我需要从该字符串中获取三条信息,并将其放入数组中,因此数组总是有三个:NAs,第二项和第三项可以是空白的。

该行将采用" First Second,Id"的形式。我需要忽略每个单词之后或每个单词之前的额外空格。

所以第一个和第二个单词之间用空格或空格来区分,第二个单词和Id用逗号区分。

要拆分的行示例:

[first, second, third] =>结果:John Doe, 1234

[John, Doe, 1234] =>结果:John [# spaces] Doe,[# spaces] 1234

[John, Doe, 1234] =>结果:[# spaces] John [# spaces] Doe [# spaces] , [# spaces] 1234

[John, Doe, 1234] =>结果:John , 1234

[John,"",1234] =>结果:John

我尝试使用正则表达式[John, "", ""],但它只适用于案例1.

如何创建包含所有这些案例的正则表达式?

2 个答案:

答案 0 :(得分:1)

对您提供的每个案例进行测试......

  

注意:根据您的示例,第二个捕获组后必须有逗号   区分两组,或三组。

     

所有示例都使用.slice(1)从返回的数组中删除第一个项目。这是因为String.prototype.match返回一个包含原始字符串的数组。

示例一: one.match(regex)=> [" John Doe,1234"," John"," Doe"," 1234"];

示例二: one.match(正则表达式).slice(1)=> [" John"," Doe"," 1234"];

如果需要,您可以在数组中包含原始字符串,但是我可以尽可能准确地回答您的问题,我将从索引1切换到数组末尾。

var one = "John Doe, 1234";
var two = "John          Doe,       1234";
var three = "           John       Doe    ,      1234    ";
var four = "John , 1234";
var five = "John";
var six = ""; // additional test.
var seven = "John doe"; // additional test.
var eight = "John Doe,        " // additional test.

// Here is the regex...
var regex = new RegExp("^\\s*(\\w*)\\s*(\\w*)\\s*,?\\s*(\\w*)");
// regex => /^\s*(\w*)\s*(\w*)\s*,?\s*(\w*)/;

one.match(regex).slice(1);
// result: ["John", "Doe", "1234"];

two.match(regex).slice(1);
// result: ["John", "Doe", "1234"];

three.match(regex).slice(1);
// result: ["John", "Doe", "1234"];

four.match(regex).slice(1);
// result: ["John", "", "1234"];

five.match(regex).slice(1);
// result: ["John", "", ""];

six.match(regex).slice(1);
// result: ["", "", ""];

seven.match(regex).slice(1);
// result: ["john", "doe", ""];

eight.match(regex).slice(1);
// result: ["John", "Doe", ""];

此外,在使用新的RegExp构建正则表达式对象时,必须对某些字符进行转义,这就是为什么double" \\"。

答案 1 :(得分:0)

我的想法是首先删除额外的空格和逗号,然后触发一个正则表达式,搜索三个组件,专门查找两个字符组和一个数字组。我在Python中尝试过它。

def get_name(namestr):
    returnable = []
    namestr = re.sub("(\s\s+)|(\,)", " ", namestr.strip())
    mat = re.match("([a-zA-Z]+)(\s+)?([a-zA-Z]+)?(\s+)?([0-9]+)?", namestr)
    if mat:
        return [mat.group(i) if mat.group(i) else '' for i in [1,3,5]]

您需要将此转换为Javascript。我试过但是我对这种语言的糟糕指挥花了我生命中的20分钟而只是试图去除多余的空间。

很高兴看到使用JS实现的建议编辑。