我希望只有一个正则表达式从以下代码中提取天数,周数,月数和/或年数:
AB7YT1M=ABC ==> 7Y1M
AB10YT1M=ABC ==> 10Y1M
AB30YT1M=ABC ==> 30Y1M
ABCDEF1Y1M=A ==> 1Y1M
ABCDEF34Y6M=A ==> 34Y6M
ABCDEF7M=A ==> 7M
ABCDEF1D=A ==> 1D
@"(\d+[DWMY])(?!\w+(1))(\d+[DWMY])(?!\w+(1))|(\d+[DWMY])(?!\w+(1))"
此代码不支持,例如30YT1M
有人可以帮我找一个合适的正则表达式吗?
答案 0 :(得分:3)
这个表达式可以解决问题(demo):
(?:(\d+)Y)?T?(?:(\d+)M)
为了获得您需要的数据,请获取第一个和第二个捕获组的内容。当字符串中存在相应的条目时,第一组将包含年份,第二组将包含月份(demo):
var data = new[] {
"AB7YT1M=ABC",
"AB10YT1M=ABC",
"AB30YT1M=ABC",
"ABCDEF1Y1M=A",
"ABCDEF34Y6M=A",
"ABCDEF7M=A"
};
Regex r = new Regex(@"(?:(\d+)Y)?T?(?:(\d+)M)");
foreach (var s in data) {
var m = r.Match(s);
if (m.Success) {
var yy = m.Groups[1];
var mm = m.Groups[2];
Console.WriteLine("Y='{0}', M='{1}'", yy, mm);
}
}
答案 1 :(得分:0)
您可以使用命名捕获来确保匹配所有必需的值,如下所示:
(?:
(?<Year>\d+)YT?
|
(?<Day>\d+)DT?
|
(?<Month>\d+)MT?
|
(?<Week>\d+)WT?
)+
如果它出现在我们需要的组之后,则会添加 T?
。