C# 将正则表达式命名组与字典键匹配
我在使用正则表达式将字符串与命名捕获组与字典列表进行匹配时遇到一些问题 字符串本身是机场气象报告: KLAX 050453Z 33003KT 10SM+TSRAGR HZ BR FEW010 SCT020 21/17 A3001 RMK AO2 SLP161 T02060172 下面是我使用的正则表达式:C# 将正则表达式命名组与字典键匹配,c#,regex,C#,Regex,我在使用正则表达式将字符串与命名捕获组与字典列表进行匹配时遇到一些问题 字符串本身是机场气象报告: KLAX 050453Z 33003KT 10SM+TSRAGR HZ BR FEW010 SCT020 21/17 A3001 RMK AO2 SLP161 T02060172 下面是我使用的正则表达式: Regex MetarExpression = new Regex(@"\s(?<intensity>[\+\-VC]{1,2})?(?<descriptor>(MI|
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");
字典:
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))");
你的正则表达式能捕获RA吗?几乎能用!我遇到的唯一问题是,如果天气类型少于三个。假设只有+rabr…它不会捕获任何东西。请注意,METAR报表上最多有三个天气组,也可以没有。只需将捕获的组设置为可选。我将捕获组设置为可选,但现在的问题是,如果只有一个天气组,则需要在其后面两个2空格才能捕获。有什么想法吗?@Zach举个例子会更好。例如,如果我有这个METAR:KLAX 050553Z 34003KT 7SM-RA HZ FEW010 21/17 A3001 RMK AO2 SLP161 T02110172 10233 20206 51015,它应该捕获-RA和HZ…如果我有KLAX 050553Z 34003KT 7SM RA FEW010 21/17 A3001 RMK AO2 SLP161 T02110172 10233 20206 51015,它应该捕获RA。
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))");
\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))