我需要一个正则表达式来查找连续8个数字的组。我得到的最接近的是:
[0-9]{8}
但它并不完全符合我的需要。如果我有一个9长的数字,它将与前8个相匹配,但如果它长于或短于8,我希望它忽略它。
以下是一些例子
1234567890 <- no match, it's longer than 8
12345678 <- match: "12345678"
1234567809876543 <- match 1: "12345678", match 2: "09876543" (two groups of 8)
,,111-11-1234,12345678, <- match: "12345678"
总结一下,对于每组正好8个数字进行匹配。
我正在使用OCR(光学字符识别)的一些结果,我必须处理结果的缺点,所以我的输入可以像上面的例子那样变化。
以下是一些用例数据:http://pastebin.com/uijF9K9n
答案 0 :(得分:2)
您可以在.NET中使用以下正则表达式:
(?<=^|\D|(?:\d{8})+)\d{8}(?=$|\D|(?:\d{8})+)
请参阅regex demo
它基于可变宽度的lookbehind和前瞻。
正则表达式细分:
(?<=^|\D|(?:\d{8})+)
- 仅限于字符串开头(^
),或者前面没有数字(\D
)或1个或更多8位数的序列((?:\d{8})+
)... \d{8}
- 匹配8位数字后面跟着...... (?=$|\D|(?:\d{8})+)
- 字符串的一端($
)或不是数字(\D
)或一个或多个8位数的序列((?:\d{8})+
)。重要强>:
如果我得到了与另一个答案相比“额外”复杂性的下注,请注意我们的解决方案:my regex matches 8-digit number in ID12345678
和the other one does not由于字边界。
答案 1 :(得分:2)
你也可以试试这个正则表达式
(?:\b|\G)\d{8}(?=(?:\d{8})*\b)
(?:\b|\G)
\b
匹配word boundary |
或\G
继续last match attempt ended \d{8}
匹配8 digits [0-9]
后跟lookahead (?=
...进行检查(?:\d{8})*\b
如果后跟任意数量的{8位数},直到另一个字边界如果在两个单词边界之间,它将匹配{8位数}或其中的序列。
答案 2 :(得分:0)
\ b [0-9] {8} \ b这会给你你想要的 有关详细信息,请查看此信息 http://www.rexegg.com/regex-boundaries.html