我必须匹配长度在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
正则表达式失败了最后一个用例。我做错了什么?
答案 0 :(得分:3)
[ |:]
表示“在此处匹配一个空格,竖线或冒号”。你可能意味着(?:^| |:)
,这意味着“在这里匹配输入,空格或冒号的开头”((?:...)
是一个非捕获组,用于对交替进行分组,这就是|
是)。
我还会做一些其他的改变:
/(?:^|\s|:)(\d[\d\s\-()]{5,13})(?:\s|$)/
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]);
}
}