【问题标题】:Regex not able to parse last group [duplicate]正则表达式无法解析最后一组 [重复]
【发布时间】:2019-08-29 11:03:40
【问题描述】:

这是测试。我希望最后一组是".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: ""

第一组和第二组工作正常。

【问题讨论】:

  • 那是因为最后一组中的?。你的模式有零个或多个字母并且是懒惰的(作为回报的第一部分匹配)。那部分只是一个空字符串

标签: c# regex


【解决方案1】:

这是因为你让第 3 组中的 * 变得懒惰:

(.*?)\[(.*?)\](.*?)
                 ^
                here

这意味着它将尽可能少地匹配。 .* 至少可以匹配什么?一个空字符串!

您可以了解更多关于懒惰与贪婪here.

您可以通过删除 ? 使其变得贪婪来解决此问题,或者在末尾添加 $,告诉它匹配直到字符串的末尾:

(.*?)\[(.*?)\](.*)

(.*?)\[(.*?)\](.*?)$

【讨论】:

  • 哦,我明白了。这非常有用,特别是这部分:What's the least .* can match? An empty string!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 1970-01-01
  • 2011-01-23
  • 2012-11-21
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多