这个问题在这里已有答案:
这是考验。我希望最后一组是".png"
,但这种模式会返回""
。
var inputStr = @"C:\path\to\dir\[yyyy-MM-dd_HH-mm].png";
var pattern = @"(.*?)\[(.*?)\](.*?)";
var regex = new Regex(pattern);
var match = regex.Match(inputStr);
var thirdGroupValue = match.Groups[3].Value;
// ✓ EXPECTED: ".png"
// ✗ CURRENT: ""
第1和第2组工作正常。
这是因为你让第3组懒惰的*
:
(.*?)\[(.*?)\](.*?)
^
here
这意味着它将尽可能少地匹配。什么是.*
可以匹配的最少?空字符串!
你可以了解更多关于lazy vs greedy here的信息。
您可以通过删除?
,使其变得贪婪或在最后放置$
来解决这个问题,并告诉它匹配到字符串的结尾:
(.*?)\[(.*?)\](.*)
要么
(.*?)\[(.*?)\](.*?)$