我需要拆分一个字符串,我需要从该字符串中获取三条信息,并将其放入数组中,因此数组总是有三个: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.
如何创建包含所有这些案例的正则表达式?
答案 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实现的建议编辑。