准确匹配10个未知边界的数字?

时间:2012-07-10 19:47:39

标签: javascript regex node.js

我是否可以使用任何正则表达式匹配正好10位数的块?例如,我有这个:

/\d{10}(?!\d+)/g

如果2154358383很好,则匹配2154358383,但在给定1213141516时也匹配12345678910111213141516,这是我不想要的。

我认为我需要的是一个后视断言(除了我已经在那里的前瞻),检查以确保匹配前的字符不是整数,但我无法弄清楚如何做这一点。

我试过

/(?:[^\d]+)\d{10}(?!\d+)/g

但这打破了2154358383的第一场比赛,这很糟糕。

如何将此编写为仅匹配具有未知边界的10个整数(不多于,不少)的组?

我还应该注意,我正在尝试从更大的字符串中提取这些字符串,因此^$是不可能的。

8 个答案:

答案 0 :(得分:4)

这应该有效:([^\d]|^)\d{10}([^\d]|$)

答案 1 :(得分:3)

你可以这样做:

([^\d]|^)(\d{10})([^\d]|$)

换句话说,字符串的开头或非数字,十位数字,然后是字符串的结尾或非数字。这应该可以解决你在上面寻找的案例。

您可以像这样使用正则表达式:

var regex = /([^\d]|^)(\d{10})([^\d]|$)/;
var match = regex.exec(s);
var digits = match[2];

答案 2 :(得分:1)

这应匹配字符串开头(^)或中间/结尾([^\d](?!\d)的数字。如果您关心完全匹配,不仅仅是它首先匹配,你还需要在比赛中抓住第一组。

/(?:[^\d]|^)(\d{10})(?!\d)/g

如果JavaScript正则表达式支持lookbehind,这将更容易。

答案 3 :(得分:1)

下一个怎么样?

perl -nle 'print if /(\b|\D)(\d{10})(\D|\b)/' <<EOF
123456789
x123456789
123456789x
1234567890
x1234567890
1234567890x
12345678901
x12345678901
x12345678901x
EOF

仅打印

1234567890
x1234567890
1234567890x

答案 4 :(得分:0)

试试这个

var re = /(?:^|[^\d])(\d{10})(?:$|[^\d])/g

re.exec ( "2154358383")
//["2154358383", "2154358383"]
re.exec ( "12345678910111213141516" )
//null
re.exec ( "abc1234567890def" )
//["c1234567890d", "1234567890"]

val = '1234567890 sdkjsdkjfsl 2234567890 323456789000 4234567890';
re.exec ( val )
//["1234567890 ", "1234567890"]
re.exec ( val )
//[" 2234567890 ", "2234567890"]
re.exec ( val )
//[" 4234567890", "4234567890"]
re.exec ( val )
//null

答案 5 :(得分:0)

我知道你说“不行”但也许你可以这样使用它吗?

rx = /(?:^|\D)(\d{10})(?!\d)/g

这是一个快速测试:

> val = '1234567890 sdkjsdkjfsl 2234567890 323456789000 4234567890'
'1234567890 sdkjsdkjfsl 2234567890 323456789000 4234567890'
> rx.exec(val)[1]
'1234567890'
> rx.exec(val)[1]
'2234567890'
> rx.exec(val)[1]
'4234567890'

答案 6 :(得分:-1)

简单的lookbehind:

/(?<!\d)\d{10}(?!\d)/g

答案 7 :(得分:-3)

我会欺骗并做类似

的事情
if (myvar.toString().substring(1, 10) = "1234567890") ....

:)