我正在接管一个用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;
有什么想法吗?
答案 0 :(得分:1)
此:
(?<Registred>.+?)
是命名的捕获组。 <Registred>
部分实际上不是匹配模式的一部分,而是定义了一个名称,该名称可用于引用括号中的匹配部分。
使用标准捕获组语法与以下内容相同:
(.+?)
所以它只是匹配一个或多个字符,非贪婪的量词使它尽可能少地匹配。
因此,该模式将匹配任何以“Déposéetenregistréle”开头的字符串,后跟至少一个字符,然后是换行符。