用字典键匹配命名为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),而不是其他两个。
有什么建议吗?
如果你想要捕获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))");
因为中间有一个空格字符,它会阻止捕获。需要指定其他组捕获HZ
和BR
单独捕获+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))
演示