0

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

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

2154358383在给定时匹配,但在给定时2154358383也匹配,这是我不想要的。121314151612345678910111213141516

我认为我需要的是一个后向断言(除了我已经在那里的前瞻之外),它检查以确保匹配之前的字符不是整数,但我不知道该怎么做。

我试过

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

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

我怎样才能把它写成只匹配具有未知边界的 10 个整数组(不多也不少)?

我还应该注意,我正试图从一个更大的字符串中提取这些,所以^并且$是不可能的。

4

8 回答 8

4

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

于 2012-07-10T19:53:20.353 回答
3

你能做类似的事情:

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

也就是说,字符串的开头还是一个非数字,十位数字,然后是字符串的结尾还是一个非数字。那应该可以解决您在上面寻找的情况。

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

var regex = /([^\d]|^)(\d{10})([^\d]|$)/;
var match = regex.exec(s);
var digits = match[2];
于 2012-07-10T19:53:22.213 回答
1

这应该匹配字符串开头 (the ^) 或中间/结尾 (the[^\d](?!\d)在比赛中分组。

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

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

于 2012-07-10T19:54:04.273 回答
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
于 2012-07-10T20:42:59.140 回答
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
于 2012-07-10T19:50:00.690 回答
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'
于 2012-07-10T19:58:22.230 回答
-1

向后看很简单:

/(?<!\d)\d{10}(?!\d)/g
于 2012-07-10T19:55:34.840 回答
-3

我会作弊并做类似的事情

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

:)

于 2012-07-10T19:50:20.877 回答