适用于不同年份格式的正则表达式C#

时间:2018-10-04 16:21:34

标签: c# regex expression builder

所以我可以在字符串中包含1个或多个年份,其格式可以是2位数字,即“ 18”,4位数字,即“ 2018”,完整日期字符串,即“ 12/04/2018”,或组合 在C#中使用正则表达式,我需要遍历该字符串,以获取包含这些格式之一中年份的所有值并将其增加1年。

例如,该字符串

  

“这是一个字符串,具有2位数字的年份-15、4位数字的年份-2015,并且从日期01/01/2015到日期02/03/2016”

应该成为

  

“这是一个字符串,具有2位数字的年份-16、4位数字的年份-2016,并且从日期01/01/2016到日期02/03/2017”

此代码的问题是使用索引超出范围的日期。 我需要一个能够处理这3种格式年份的逻辑。如果它包含独立的有效年份2位数字,4位数字或日期(格式为dd / mm / yyyy)

    public string Increment(string text)
    {
        if (text == null) return null;
        var builder = new StringBuilder(text);

        var matches = Regex.Matches(text, @"\b(?:\d{4}|\d{2})\b");
        foreach (Match match in matches)
        {
            if (match.Success)
            {
                builder.Remove(match.Index, match.Length);
                builder.Insert(match.Index, int.Parse(match.Value) + 1);
            }
        }

        return builder.ToString();
    }

1 个答案:

答案 0 :(得分:1)

您可以将Regex.Replace与MatchEvaluator一起使用。试试这个代码

var regex = new Regex("\\b(?<prefix>\\d{2}/\\d{2}/)?(?<year>\\d{2}|\\d{4})\\b");
var result = regex.Replace(text, match => $"{match.Groups["prefix"].Value}{int.Parse(match.Groups["year"].Value) + 1}");

正则表达式包含两组:可选前缀和年份。在MatchEvaluator的“年”组中,解析为int并加了1

Demo