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

标签 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

最佳答案

您可以在 .NET 中使用以下正则表达式:

(?<=^|\D|(?:\d{8})+)\d{8}(?=$|\D|(?:\d{8})+)

参见 regex demo

它基于可变宽度后向查找和先行查找。

正则表达式分割:

  • (?<=^|\D|(?:\d{8})+) - 仅当位于字符串开头 ( ^ ),或前面没有数字 ( \D ) 或 1 个或多个 8 位数字序列 ( (?:\d{8})+ )...
  • \d{8} - 匹配后面跟着的 8 位数字...
  • (?=$|\D|(?:\d{8})+) - 字符串末尾 ( $ ) 或不是数字 ( \D ) 或 1 个或多个 8 位数字序列 ( (?:\d{8})+ )。

重要:

如果与另一个答案相比,我因“额外”复杂性而投了反对票,请注意我们的解决方案不同: my regex matches 8-digit number in ID12345678 the other one does not 由于单词边界而不同。

关于c# - 使用正则表达式多次查找精确长度匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33745957/

相关文章:

c# - 关闭 HttpWebRequest 以释放资源

c# - 非泛型 Mvx.Resolve() 方法?

javascript - 如何在 RegEx 中分割可选参数?

php - 如何在 PHP 字符串中仅在完整的 CamelCase 单词之间添加空格,完整地跳过单个大写字母?

所有数字和小数点格式的 Javascript 正则表达式

c# - 上传文件控件在后面的代码中不显示任何文件

c# - 有没有办法从静态方法调用非静态方法?

c# - 开放通用类型是否被认为是具体的?我们如何通过参数化来限定抽象?

python - 使用正则表达式Python根据模式提取部分字符串

c++ - 解析字符串的正则表达式模式