2

谁能帮助我更接近我想要得到的结果?

扫描图像后,我将此字符串作为 OCR 结果返回:

7915-03226E3058-089179 祝您在 2013 年 9 月 4 日星期三抽奖好运 您的号码 A06 09 26 40 43 45 B 06 14 18 28 43 48 C 02 16 22 34 39 42 1111111 II 1111111113 E = 1111110 110 英镑 x 11 抽奖。上周 3.00,乐透有超过 700,000 名中奖者!7915-032268058-089179 013779 期限。46377201 E - •我填写此框以使票无效

我正在尝试提取值"A06 09 26 40 43 45","B 06 14 18 28 43 48""C 02 16 22 34 39 42"

老实说,我不需要"A","B""C". 我只需要每个数字后面的 12 个数字。

我有正则表达式

[A-Z](\W*\d{2}){6}

但这会提取我不想要的额外信息,如下所示:http ://regexr.com?372b7

谁能建议如何靠近?有没有更好的方法来尝试获取票号?

4

3 回答 3

5

您的问题主要围绕\W*,这允许任何数量(包括 0)的任何非单词字符。所以基本上 111111111111 将匹配您的捕获组正则表达式和您的整个正则表达式(如果前面有一个大写字母)。看起来您想要由空格分隔的 2 位数字对,您可以这样做:

[A-Z]\s*(\d{2}\s+){6}

演示

在此处输入图像描述

\s+确保至少有一个空格字符分隔这些对。


尽管上面(与原始版本一样)只会将最后一对数字放入捕获中。要解决这个问题并忽略尾随空格,可以这样做:

[A-Z]\s*(\d{2}(?:\s+\d{2}){5})

演示

在此处输入图像描述

请注意,这(?...)是创建一个非捕获组,因此我们可以在不弄乱捕获组的情况下进行重复。现在这会将所有 6 对数字放入捕获组 1(这将是唯一的额外捕获)。\s*此外, after the的原因[A-Z]是在前导字符之后似乎有可选的空格。

于 2013-11-05T13:50:15.030 回答
2
[A-Z]\s*([0-9]{2}\s+){6}

任何大写字母,任意数量的空格(或无),然后是任意 2 位数字,后跟一个或多个空格,6 次

于 2013-11-05T13:53:18.910 回答
2

试试这个。一个字母,然后是可选空格,然后是六个 2 位数字,它们之间必须至少有一个空格,但最后不必有空格

[A-Z]\s*((\d{2}\s+){5}\d{2})

演示

更新:

你说你不是特别想检索 A/B/C/letter 部分。如果您的正则表达式引擎支持环视,您可以使用:

(?<=[A-Z]\s*)((\d{2}\s+){5}\d{2})

正则表达式可视化

调试演示

只得到字母后面的数字。

更新 2:更新 1 可能不起作用——我怀疑重复组可以用于后视。只需使用第一个建议[A-Z]\s*((\d{2}\s+){5}\d{2}),捕获组 1 将是您所追求的数字。

于 2013-11-05T13:53:27.133 回答