使用正则表达式多次查找精确长度匹配

时间:2015-11-16 22:37:32

标签: c# regex

我需要一个正则表达式来查找连续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

3 个答案:

答案 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 ID12345678the other one does not由于字边界。

答案 1 :(得分:2)

你也可以试试这个正则表达式

(?:\b|\G)\d{8}(?=(?:\d{8})*\b)

如果在两个单词边界之间,它将匹配{8位数}或其中的序列。

See demo at regexstorm

答案 2 :(得分:0)

\ b [0-9] {8} \ b这会给你你想要的 有关详细信息,请查看此信息 http://www.rexegg.com/regex-boundaries.html