这是对早期问题(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
再次感谢你们!
答案 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)?)
您也可以尝试创建特定于每种常规案例(多行,单行等)的较小正则表达式,并使用或者分隔它们。正则表达式会有点丑陋,但可能更容易找到解决方案。
祝你好运!