从连字符开始的不和谐4位数字

时间:2014-08-25 22:42:46

标签: javascript regex

在尝试某些数字验证时,有一种情况我想排除一个数字 - 如果它在四位数之前包含连字符。

为了简化我的正则表达式,我们只担心这4位数字。

由于我使用JavaScript,因此我无法使用lookbehinds。

为了尝试使用负向前瞻来匹配任何不包含连字符的内容,我提出了:

((?!-).)\d{4}

我的测试数据如下,粗体是匹配:

2014
1106 **2014** **9899**
**11500**

234-233-2014
234-234-1100
-1100

我的期望是2014,1106,2014和9989匹配,而11500没有。我知道问题在于这段时间是因为它匹配除了换行符以外的任何东西。当我将单词边界应用于正则表达式时,我也在尝试考虑换行符。

可能有一个更好的解决方案,我只能匹配一个没有连字符的4位数字,或者只是排除任何匹配,如果它们前面有连字符?

4 个答案:

答案 0 :(得分:2)

仅通过正则表达式,

(?:(?!\b-\b|-\b)(?:.|^))\b(\d{4})\b

从组索引1中获取数字。

DEMO

你的js代码就是,

> console.log(text.match(/(?:(?!\b-\b|-\b)(?:.|^))\b(\d{4})\b/g));
[ '2014', ' 1106', ' 2014', ' 9899' ]

> function getMatches(string, regex, index) {
... index || (index = 1);
... var matches = [];
... var match;
...     while (match = regex.exec(string)) {
.....         matches.push(match[index]);
.....     }
... console.log(matches);
... }
undefined
> var matches = getMatches(text, re, 1);
[ '2014', '1106', '2014', '9899' ]

代码从here被盗: - )

答案 1 :(得分:1)

尽管这会使您的搜索量翻倍,但您可以使用正面和负面组件进行前瞻:

(?=(?!-)\d{4})\b\d{4,}\b

regex101 example不会捕获此regex101 example所在的数字。

答案 2 :(得分:0)

这是使用replace()

的JavaScript中的解决方法
var text = "2014 \
1106 2014 9899 \
 11500 \
\
234-233-2014 \
234-234-1100 \
-1100";

var a = [];
text.replace(/(-?\b\d{4}\b)/g, function(m){
  if(!m.match(/-/g)) a.push(m);  
});

console.log(a); 

输出:

["2014", "1106", "2014", "9899"] 

Working jsBin


以前的尝试(使用JavaScript不支持的后视)

/(?<!-)\b(\d{4})\b/g

Demo

答案 3 :(得分:0)

匹配作为一行开头的四位数字,或连字符后不会出现的四位数字:

/[^-]\b\d{4}\b|^\b\d{4}\b/