4

如果可能的话,我希望得到一些正则表达式指导,因为我对它们很垃圾:(

我已经扫描了一张彩票到文本,我正试图从返回的文本中提取彩票号码。

这是返回的字符串:

"if * it • 
Including Millionaire Raffle
7618-011874089-204279   111111111111111111111111111111
Goad luck for your draw on Fri 09 Nov 12
Your numbers
Lucky Stars
A 1 8 22 37 47 48 - 03 10
B11 15 26 43 44 - 05 06
C 08 23 27 28 29 - 02 09
D06 09 21 26 29 - 01 05
E 06 07 21 22 45 - 04 05
Your raffle numbers) for your draw(s)
PRC690104 
PRC690105 
PRC690106 
PRC690107 
1DRC690108
CHECK YOUR MILLIONAIRE RAFFLE 
RESULTS ONLINE AT 
WWW.NATIONAL-LOTTERY.CO.UK
5 plays x f2.00 for 1 draw = f10.00
HUGE EUROMILLIONS JACKPOTS TO
PLAY FOR EVERY TUESDAY AND
FRIDAY! PLAY TODAY FOR THE
CHANCE TO WIN YOUR WILDEST
DREAMS!
7618-011874089-204279 035469 Term. 26048301
Fill the box to void the ticket
11111111111111111111111 1111111111111111111111111"

这是扫描的图像:

被扫描的票

如您所见,彩票号码似乎总是出现在“幸运星”和“您的抽奖”之间

谁能建议如何去除结果,以便我得到“A18223747480310”,“B11152643440506”,“C08232728290209”,“D06092126290105”,“E06072122450405”?

任何帮助将不胜感激!

4

4 回答 4

1

Regex和的组合string.Split会更简单、更有效:

Regex reg = new Regex("(?s)(?<=Lucky Stars).+?(?=Your raffle numbers)");
string[] yourNumbers = Regex.Replace(reg.Match("inputString").Value,"[ -]", "")
                            .Split(new char[]{'\n'}, StringSplitOptions.RemoveEmptyEntries);
于 2013-08-25T09:44:19.330 回答
1

让我们尽量保持简单:每个彩票号码由一个字母组成AE后跟正好 14 个数字,每个数字之间可能有多个空格和/或连字符 (-) 字符。

所以这里有一个正则表达式来提取每个彩票号码:

[A-E]([\s-]*\d){14}

可视化:(来自Debuggex 演示

正则表达式可视化

然后通过用空字符串替换所有空格和破折号来获得所需的结果。

于 2013-08-25T11:07:18.687 回答
0

由于结果以 0 开头(例如,08 表示 8),因此简单的方法是每隔 2 位拆分一次。不需要正则表达式。

于 2013-08-25T09:28:31.107 回答
0

这对正则表达式应该适用于您向我们展示的案例。

/// <summary>
///  Regular expression built for C# on: Sun, Aug 25, 2013, 12:55:52 PM
///  Using Expresso Version: 3.0.4334, http://www.ultrapico.com
///  
///  A description of the regular expression:
///  
///  Match expression but don't capture it. [Lucky Stars\r\n]
///      Lucky Stars\r\n
///          Lucky
///          Space
///          Stars
///          Carriage return
///          New line
///  [Numbers]: A named capture group. [.*\r\n], exactly 5 repetitions
///      .*\r\n
///          Any character, any number of repetitions
///          Carriage return
///          New line
///  
///
/// </summary>
public static Regex regex = new Regex(
      "(?:Lucky Stars\\r\\n)(?<Numbers>.*\\r\\n){5}",
    RegexOptions.CultureInvariant
    | RegexOptions.Compiled
    );


public static Regex replaceRegex = new Regex(
      "(\\s-.*\r\n)",
    RegexOptions.CultureInvariant
    | RegexOptions.Compiled
    );

数字检索的代码可能如下:

var InputText = @"Lucky Stars
A 1 8 22 37 47 48 - 03 10
B11 15 26 43 44 - 05 06
C 08 23 27 28 29 - 02 09
D06 09 21 26 29 - 01 05
E 06 07 21 22 45 - 04 05
Your raffle numbers";

Match m = regex.Match(InputText);
var numbers = m.Groups["Numbers"].Captures
    .OfType<Capture>()
    .Select(c => replaceRegex.Replace(c.Value, "").Replace(" ", ""));

但我怀疑使用正则表达式是否是使用 OCR 技术从图片中获取文本的最佳解决方案。

于 2013-08-25T09:36:59.030 回答