-1

所以我有这个飞行数据列表,我需要能够使用正则表达式解析它(这不是整个列表)。

1 AA2401 F7 A4 Y7 B7 M7 H7 K7 /DFW A LAX 4 0715 0836 E0.M80 9 3:21
 2 AA2421 F7 A1 Y7 B7 M7 H7 K7 DFWLAX 4 1106 1215 E0.777 7 3:09
 3UA:US6352 B9 M9 H9 K0 /DFW 1 LAX 1200 1448 E0.733 1:48

例如,我可能需要从第一行开始 1、AA、2401,以此类推。现在,我不是要求有人为我想出一个正则表达式,因为在大多数情况下,我已经到达了我自己几乎可以处理的地方。我的问题更多地与能够将数据存储在某个地方并访问它有关。

所以我只是想最初只是“匹配”我需要的第一条数据,即行号“1”。我仅获取第一个数字的“模式”是: ".?(\d{1,2}).*" 。它是 {1,2} 的原因是因为很明显,一旦你超过 10,它就需要能够取 2 个数字。该行的其余部分设置为肯定是空格或字母。

这是代码:

var assembly = Assembly.GetExecutingAssembly();
var textStreamReader = new StreamReader(
    assembly.GetManifestResourceStream("FlightParser.flightdata.txt"));
List<string> lines = new List<string>();
do
{
    lines.Add(textStreamReader.ReadLine());
} while (!textStreamReader.EndOfStream);


Regex sPattern = new Regex(@".?(\d{1,2}).*");//whatever the pattern is

foreach (string line in lines)
{
    System.Console.Write("{0,24}", line);

    MatchCollection mc = sPattern.Matches(line);
    if ( sPattern.IsMatch(line))
    {
        System.Console.WriteLine("  (match for '{0}' found)", sPattern);
    }
    else
    {
        System.Console.WriteLine();
    }
    System.Console.WriteLine(mc[0].Groups[0].Captures);

    System.Console.WriteLine(line);
}//end foreach
System.Console.ReadLine();

使用我正在编写的代码,我基本上只是试图将“1”放入匹配集合并以某种方式访问​​它并将其写入控制台(为了测试,这不是最终目标)。

4

3 回答 3

0

以下表达式与“First”组中您要捕获的第一个数字匹配。

^\s*(?<First>\d{1})

我发现这个正则表达式工具在处理正则表达式时非常有用。试试看。在进行匹配时,还将 RegexOption 设置为 Multiline。

于 2012-06-26T02:55:20.930 回答
0

您的正则表达式模式包含一个与任意数量的字符匹配的星号 - 即。整条线。删除“*”,它将只匹配“1”。您可能会发现这样的在线 RegEx 测试器很有用。

于 2012-06-26T00:40:12.093 回答
0

假设您的文件实际上并未像您发布的那样格式化并且每个字段都由某些东西分隔,您可以将行的前两位数与此正则表达式匹配(忽略 0 和前导零):

^\s*([1-9]\d?)

由于是分组的,所以可以通过对象的Groups属性访问匹配的部分Match

var line = "12 foobar blah 123 etc";
var re = new Regex(@"^\s*([1-9]\d?)");
var match = re.Match(line);
if (match.Success)
{
    Console.WriteLine(match.Groups[1].Value); // "12"
}
else
{
    Console.WriteLine("No match");
}
于 2012-06-26T00:40:28.650 回答