如何匹配由空格或行首开始的数字

时间:2017-11-02 12:19:49

标签: javascript regex

我必须匹配长度在6-14之间的数字,用空格或分隔,或者在行的开头。我正在使用以下正则表达式:/[ |:](\d[\s\-()]*){6,14}/g

对于以下输入行,它匹配如下,

Number1 :545-867-4845 - match +545-867-4845
Number2=5459485459855 - no match
Number3: 9526 4412 52 - match +9526 4412 52
Number4 55 55 55 - match +55 55 55
Number52017 11 - no match   
5459485459855 - no match //should match

正则表达式失败了最后一个用例。我做错了什么?

2 个答案:

答案 0 :(得分:3)

[ |:]表示“在此处匹配一个空格,竖线或冒号”。你可能意味着(?:^| |:),这意味着“在这里匹配输入,空格或冒号的开头”((?:...)是一个非捕获组,用于对交替进行分组,这就是|是)。

我还会做一些其他的改变:

/(?:^|\s|:)(\d[\d\s\-()]{5,13})(?:\s|$)/
  • 从输入开头,空格或冒号开始
  • 需要数字
  • 需要5-13个数字,空格,破折号或括号(总计6-14个)
  • 需要空格或输入结尾
  • 没有g旗帜

示例和测试:

var rex = /(?:^|\s|:)(\d[\d\s\-()]{5,13})(?:\s|$)/;
[
    {str: "Number1 :545-867-4845", expect: "545-867-4845"},
    {str: "Number2=5459485459855", expect: null},
    {str: "Number3: 9526 4412 52", expect: "9526 4412 52"},
    {str: "Number4 55 55 55",      expect: "55 55 55"},
    {str: "Number52017 11",        expect: null},
    {str: "5459485459855",         expect: "5459485459855"}
].forEach(test);

function test(entry) {
    var match = rex.exec(entry.str);
    match = match && match[1];
    console.log("Testing " + entry.str + ", got " + match + ", " + (match == entry.expect ? "OK" : "ERROR"));
}

答案 1 :(得分:1)

在匹配预期匹配前面的空格或冒号时,您必须添加一个匹配字符串开头的替代方法:(?:^|[ :])(或(?:^|[\s:])以考虑任何空格)。

此外,您需要检查双方的上下文,以确保匹配所需长度的数字序列(其间有一些非数字符号)。现在,即使在第14位数字后面有更多数字,您也将匹配14位数字块,并且您还将匹配数字之间允许的任何尾随非数字字符。要确保获得6到14位数字,请添加(?!\d)否定前瞻,如果当前位置右侧有一位数字,则会导致匹配失败。

我建议将其改写为

/(?:^|[\s:])(\d(?:[\s()-]*\d){5,13})(?!\d)/g

请参阅regex demo。获取第1组值:

var rx = /(?:^|[ :])(\d(?:[\s()-]*\d){5,13})(?!\d)/g;
var strs = ["Number1 :545-867-4845","Number2=5459485459855","Number3: 9526 4412 52","Number4 55 55 55","Number52017 11","5459485459855"];
for (var s of strs) {
  var m;
  while (m = rx.exec(s)) {
    console.log(s, "=>", m[1]);
  }
}