0

我完全不知道如何实现这一目标。基本上,我想在 METAR 报告中找到上限。天花板是最小的破碎或阴天。

我目前有这个(无论如何都不多):

MatchCollection matches = Regex.Matches(modify, @"(BKN|OVC)([0-9]{3})");
foreach (Match match in matches)
{
    foreach (Capture capture in match.Captures)
    {
        // compare broken and overcast layers to find smallest value and set as the ceiling
        Console.WriteLine(capture.Value);
    }
}

基本上,这会在 METAR 字符串中搜索 BKN 或 OVC 层并将它们吐出。以这个 METAR 读数为例:

PANC 040553Z 17013G24KT 280V360 2SM FEW050 BKN019 BKN008 OVC005 14/M07 A2999 RMK AO2 SLP156 SH DSNT W-N T01390067 10167 20139 53002

我目前拥有的代码会吐出 BKN019、BKN008 和 OVC005。我需要做的是选择这些值中的最小值(在本例中为 OVC005)。

如果有人可以帮助我,我将不胜感激。

4

4 回答 4

3

尝试使用捕获组:

// (?<number> names the group that captures the number value
var matches = Regex.Matches(modify, @"(BKN|OVC)(?<number>[0-9]{3})");

// cast to IEnumerable<Match>()
var smallest = matches.Cast<Match>()
    // order by the parsed number group
    // Added `.Value` to make this work
    .OrderBy(m => int.Parse(m.Groups["number"].Value))
    // Select the string value
    .Select(m => m.Value)
    // take the first (the smallest)
    .FirstOrDefault();

如果最小,null则找不到匹配项

于 2013-07-04T18:55:20.883 回答
1

基本上你想要做的是跟踪到目前为止找到的最低层,然后检查每个正则表达式匹配是否低于以前:

int lowestLayer = int.MaxValue;
MatchCollection matches = Regex.Matches(modify, @"(BKN|OVC)([0-9]{3})");
foreach (Match match in matches)
{
    foreach (Capture capture in match.Captures)
    {
        int layer = int.Parse(capture.Value.Substring(3));
        if (layer < lowestLayer)
            lowestLayer = layer;
        Console.WriteLine(capture.Value);
    }
}
于 2013-07-04T18:53:37.973 回答
1

如果我理解正确,您想为最小的第二组进行整个捕获。

matches.OfType<Match>()
       .Select(m => new { Capture = m.Groups[0], Number = Int32.Parse(m.Groups[2]) })
       .OrderBy(m =­> m.Number)
       .Select(m => m.Capture)
       .FirstOrDefault();
于 2013-07-04T18:56:35.290 回答
0

Linq是你的朋友

记住using System.Linq

MatchCollection matches = Regex.Matches(modify, @"(BKN|OVC)([0-9]{3})");
var first = (
             from x in matches.OfType<Match>()
             orderby int.Parse(x.Groups[2].Value)
             select x.Value
            ).FirstOrDefault();
于 2013-07-04T19:04:52.537 回答