如何优化RegEx(\ bL \ s * \ d {6} \ s * \ d {7} \ b)

时间:2009-05-02 16:44:39

标签: regex

这是对早期问题(Help Refining RegEx ("\b\d{6}([ ]{1,15})\d{7}\b"))的后续跟进。目标是从文件中获取Lat / Lon。这由L或6d / 7d的模式表示。我错误地说在Lat(305455)和Lon(1025446)的开始之间不存在alpha。当我实现提议的正则表达式时,一切都很棒,直到我点击这个文件。请注意,'6770G37包含alpha并打破了模式或它有6位数字并重新启动模式。用Reg Ex来解决这个问题还不够好。以下是我需要找到的三种不同模式。谢谢!

I  FST E  030                                                       66686500    
    L  305455                                              '6770G37 66686501    
       1025446                                             '6770G37 66686502    
    O  ZCA/999                                                      66686503    
    H  05                                                           66686504    

I  ARA                                    '* ACADIANA  AIRPORT         29865996    
            L    300216                               '2425     29865997    
                 0915302                              '2425     29865998    
            S    MSY                                            29865999   

I JENNA078033 ' ZFW L 322823 0923754 ' ZFW

(已删除答案转发)

这是Gishu答案的后续内容,但无法使评论区域格式化得足够好。他提出的正则表达式L\s*(\d{6})\s*(?:'.*\n)?\s*(\d{7})为几种可能性工作,但是在使用带有多行选项的.Net引擎的情况下失败了。

目标是捕获Lat 322441和Lon 0994055。

退回比赛:

L  322441                                             '1325     66685780 

样本数据.....

I  ABI E   018                                                          66685779    
        L  322441                                             '1325     66685780    
           0994055                                            '1325     66685781    
        O  ZCF/999                                                      66685782    
        H  05                                                           66685783    

再次感谢你们!


这是Gishu答案的后续内容,但无法使评论区域格式化得足够好。他提出的正则表达式L\s*(\d{6})\s*(?:'.*\n)?\s*(\d{7})为几种可能性工作,但是在使用带有多行选项的.Net引擎的情况下失败了。

目标是捕获Lat 322441和Lon 0994055。

退回比赛:

L  322441                                             '1325     66685780 

样本数据.....

I  ABI E   018                                                          66685779    
        L  322441                                             '1325     66685780    
           0994055                                            '1325     66685781    
        O  ZCF/999                                                      66685782    
        H  05                                                           66685783    

再次感谢你们!

2 个答案:

答案 0 :(得分:1)

看看这个是否有效.. L\s*(\d{6})\s*(?:'.*\n)?\s*(\d{7})

string sText = @" ..." // all the different patterns you posted. I think I have 4
Regex regex = new Regex(@"L\s*(\d{6})\s*(?:'.*\n)?\s*(\d{7})", RegexOptions.Multiline);
foreach (Match everyMatch in regex.Matches(sText))
{
  Console.WriteLine("L {0}, {1}", everyMatch.Groups[1], everyMatch.Groups[2]);
}

输出:

L 305455, 1025446
L 300216, 0915302
L 322823, 0923754
L 322441, 0994055

答案 1 :(得分:0)

您可以尝试通过强制执行合法的lat / lon值来帮助匹配。 0994055似乎意味着99 40'55“。如果是这种情况,这意味着你的第一个数字总是为1或0(我认为它可能会从0-360开始,因为没有迹象表明,但是没有任何迹象表明lat,或者似乎只限于6个字符,这表示符号存储在别处或根本不存储。

因此,而不是(\ d {7})尝试([01] \ d {6})

我还注意到跟随lat和lon的'######的模式,它总是一样的。所以也许尝试使用反向引用:

L\s*(\d{6})\s*(('\d*)\s*.*\n)?\s*(\d{7}(\s*\3)?)

您也可以尝试创建特定于每种常规案例(多行,单行等)的较小正则表达式,并使用或者分隔它们。正则表达式会有点丑陋,但可能更容易找到解决方案。

祝你好运!