C#正则表达式 - 从代码

时间:2015-04-25 09:43:33

标签: c# regex

我希望只有一个正则表达式从以下代码中提取天数,周数,月数和/或年数:

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

有人可以帮我找一个合适的正则表达式吗?

2 个答案:

答案 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?

请参阅demo on regexstorm.net