奇怪的正则表达式语法,不应该与字符串匹配

时间:2016-09-26 15:37:22

标签: c# regex

我正在接管一个用C#编写的Datamining项目,该项目正在解析一些原始文本文件,以便在数据库中存储有用的数据。

现在没有问题,一切都在开箱即用,但我对一些正则表达式的语法有误解。

事实上,为什么表达式为Déposé et enregistré le (?<Registred>.+?)\s*(\r\n)

匹配字符串Déposé et enregistré le 16/09/2016

我希望正则表达式与Déposé et enregistré le ([0-9]{2}\/[0-9]{2}\/[0-9]{4})匹配,以匹配我的字符串。

让我迷失的问题是(?<Registred>.+?)部分,我认为该部分不应与16/09/2016之类的日期匹配。

以下是与字符串匹配的代码示例:

var results = new List<RegexResult>();
String regexS = r.RegexValue;

try
{
    var regex = new System.Text.RegularExpressions.Regex(regexS, RegexOptions.None, new TimeSpan(TimeSpan.TicksPerSecond * 3));
    var matchCollection = regex.Matches(data.Data);

    if (matchCollection.Count > 0)
    {
        int occurenceCounter = 0;
        foreach (Match match in matchCollection)
        {
            string[] capturedGroup = regex.GetGroupNames();
            foreach (string groupName in capturedGroup)
            {
                string resultValue = match.Groups[groupName].Value.Trim();
                if (groupName != "0")
                {
                    results.Add(new RegexResult(data.Id, r, resultValue, groupName, occurenceCounter));
                }
                log.Info("RawData Id : {0} | Regex Id : {1} | groupName {2} : {3}", data.Id, r.Id, groupName, resultValue);
            }
            occurenceCounter++;
        }
    }
}
catch (RegexMatchTimeoutException e)
{
    log.Error("RegexMatchTimeoutException for Id {0} and regex {1}", data, regexS, e);
}            

return results;

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

此:

(?<Registred>.+?)

命名的捕获组<Registred>部分实际上不是匹配模式的一部分,而是定义了一个名称,该名称可用于引用括号中的匹配部分。

使用标准捕获组语法与以下内容相同:

(.+?)

所以它只是匹配一个或多个字符,非贪婪的量词使它尽可能少地匹配。

因此,该模式将匹配任何以“Déposéetenregistréle”开头的字符串,后跟至少一个字符,然后是换行符。