用字典键匹配命名为groups的正则表达式

本文关键字:groups 正则表达式 命名为 字典 | 更新日期: 2023-09-27 18:11:44

我有一些问题匹配字符串使用正则表达式与命名捕获组对字典列表。

字符串本身是一个机场METAR(天气报告):

KLAX 050453Z 33003KT 10SM +TSRAGR HZ BR FEW010 SCT020 21/17 A3001 RMKAO2 SLP161 T02060172

这里是我使用的正则表达式:

Regex MetarExpression = new Regex(@"'s(?<intensity>['+'-VC]{1,2})?(?<descriptor>(MI|PR|BC|DR|BL|SH|TS|FZ))(?<group>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS))+'s");

基本上我需要重写天气组(在这个例子中,+TSRAGR, HZ和BR)到他们各自的翻译,这将是"雷暴,大雨,冰雹,雾霾,薄雾"

这是我目前必须做翻译的代码逻辑:

Match m = MetarExpression.Match(metar);
if (m.Success)
{
    StringBuilder sb = new StringBuilder();
    if(phenom.ContainsKey(m.Groups["descriptor"].Value))
    {
        sb.Append(phenom[m.Groups["descriptor"].Value]);
        sb.Append(", ");
    }
    if (phenom.ContainsKey(m.Groups["intensity"].Value))
    {
        sb.Append(phenom[m.Groups["intensity"].Value]);
        sb.Append(" ");
    }
    foreach (Capture cap in m.Groups["group"].Captures)
    {
        if (phenom.ContainsKey(cap.Value))
        {
            sb.Append(phenom[cap.Value]);
            sb.Append(" ");
        }
    }
    Console.WriteLine(sb);
}
字典:

  static Dictionary<string, string> phenom = new Dictionary<string, string>
  {
      {"-", "Light"},
      {"+", "Heavy"},
      {"VC","In the Vicinity"},
      // descriptor
      {"MI","Shallow"},
      {"PR","Partial"},
      {"BC","Patches"},
      {"DR","Low Drifting"},
      {"BL","Blowing"},
      {"SH","Showers"},
      {"TS","Thunderstorm"},
      {"FZ","Freezing"},
      // precipitation
      {"DZ","Drizzle"},
      {"RA","Rain"},
      {"SN","Snow"},
      {"SG","Snow Grains"},
      {"IC","Ice Crystals"},
      {"PL","Ice Pellets"},
      {"GR","Hail"},
      {"GS","Small Hail/Snow Pellets"},
      {"UP","Uknown Precipitation"},
      // obscuration
      {"BR","Mist"},
      {"FG","Fog"},
      {"FU","Smoke"},
      {"VA","Volcanic Ash"},
      {"DU","Widespread Dust"},
      {"SA","Sand"},
      {"HZ","Haze"},
      {"PY","Spray"},
      // other
      {"PO","Well-Developed Dust/Sand Whirls"},
      {"SQ","Squalls"},
      {"FC","Funnel Cloud Tornado Waterspout"},
      {"SS","Sandstorm"},
      {"DS","Duststorm"}
  };

我遇到的问题是,它只捕获第一个天气组(+TSRAGR),而不是其他两个。

有什么建议吗?

用字典键匹配命名为groups的正则表达式

如果你想要捕获HZ和BR,那么试试下面的

Regex MetarExpression = new Regex(@"'s(?<intensity>['+'-VC]{1,2})?(?<descriptor>(MI|PR|BC|DR|BL|SH|TS|FZ))(?<group>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS))'s(?<group1>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS))'s(?<group2>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS))");

因为中间有一个空格字符,它会阻止捕获。需要指定其他组捕获HZBR

演示

单独捕获+TSRAGR HZ BR

's(?<intensity>['+'-VC]{1,2})?(?<descriptor>(MI|PR|BC|DR|BL|SH|TS|FZ))(?<group>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS))(?<group1>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS))+'s(?<group2>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS))'s(?<group3>(DZ|RA|SN|SG|IC|PL|GR|GS|UP|BR|FG|FU|VA|DU|SA|HZ|PY|PO|SQ|FC|SS|DS))
演示