验证整个字符串并获取所有匹配项

时间:2016-08-05 09:05:07

标签: javascript regex string

如果它包含以空格分隔的数字,我想验证我的字符串输入。我尝试使用正则表达式

var logout = browser.element('.logout');
logout.waitForExist(5000);
browser.click('.logout');

并且能够通过^(\d)(?:\s(\d))*$ 方法检查有效性,但是当我使用test(String)时,它并没有给我正确的匹配。

例如,我有输入

str.split(regex)

当我尝试使用2 3 4 5 方法时,我得到了

split

我期待结果是

["", "2", "5", ""]

非常感谢任何建议,谢谢!

2 个答案:

答案 0 :(得分:2)

您的^(\d)(?:\s(\d))*$正则表达式正确地将字符串拆分为["", "2", "5", ""],因为:

  • 第一个(\d) 在字符串的开头捕获一个数字,并将其插入到结果数组中。由于数字位于开头,因此字符串开始前的空字符串和第一个数字显示为第一个数组元素,而2是第二个
  • (?:\s(\d))*构造是一个* - 量化的非捕获组,它匹配一个空格后跟一个数字的0 +序列,并且该数字被捕获。也就是说,每次匹配空格+数字时,第2组插槽将重新写入一个新值,最后一个插槽保持这种方式,即5。由于右侧分割边界发生在字符串的末尾,因此将空字符串添加到结果数组中。

如果你的字符串已经过验证,你不需要/\d+/g,你可能只是用空格分割(注意你的正则表达式中捕获组是多余的):



var s = "2 3 4 5";
if (/^\d(?:\s\d)*$/.test(s)) {
  console.log(s.split(" "));  
}
// var s = "2 3 4 a"; won't show any output




答案 1 :(得分:1)

使用带有全局选项g的正则表达式\d+(告诉.match返回所有匹配而不是第一个匹配):

"2 3 4 5".match(/\d+/g)

结果:["2", "3", "4", "5"]

编辑:要测试输入字符串的有效性(要求:用空格分隔的数字),请使用:

(/^(\d )+\d?$/).test("1 2 3 4 a")

(\d )+匹配数字后跟空格的任意重复次数,\d?匹配可能的后续数字而没有后续的空白字符。