正则表达式Tweek

时间:2013-11-05 13:46:23

标签: c# regex visual-studio

任何人都可以帮助我更接近我想要获得的结果吗?

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

  

7915-03226E3058-089179祝你好运3月4日星期三04你的号码A06 09 26 40 43 45 B 06 14 18 28 43 48 C 02 16 22 34 39 42 1111111 II 111111111111111111111 3次x£1.00表示1平局= E 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

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

3 个答案:

答案 0 :(得分:5)

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

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

Demo

enter image description here

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


虽然上面(与原文一样)只会将最后一对数字放在捕获中。要修复它并忽略尾随空格,可以这样做:

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

Demo

enter image description here

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

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

Demo

更新

你说你并不特别想要找回A / B / C /字母部分。如果您的正则表达式引擎支持环视,则可以使用:

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

Regular expression visualization

Debuggex Demo

只收到信后的数字。

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