我是否可以使用任何正则表达式匹配正好10位数的块?例如,我有这个:
/\d{10}(?!\d+)/g
如果2154358383
很好,则匹配2154358383
,但在给定1213141516
时也匹配12345678910111213141516
,这是我不想要的。
我认为我需要的是一个后视断言(除了我已经在那里的前瞻),检查以确保匹配前的字符不是整数,但我无法弄清楚如何做这一点。
我试过
/(?:[^\d]+)\d{10}(?!\d+)/g
但这打破了2154358383
的第一场比赛,这很糟糕。
如何将此编写为仅匹配具有未知边界的10个整数(不多于,不少)的组?
我还应该注意,我正在尝试从更大的字符串中提取这些字符串,因此^
和$
是不可能的。
答案 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") ....
:)