【问题标题】:Why does the following regex match this text?为什么以下正则表达式与此文本匹配?
【发布时间】:2012-07-26 00:19:34
【问题描述】:

我有正则表达式:(?ms)(?<attribute>\[.+?\]|public|private|\s)+?class

我有文字:

[attribute]
public int a;

[attribute C]
[attribute B]
public class Test{

}

我想知道为什么我发布的正则表达式匹配:

[attribute]
public int a;

[attribute C]
[attribute B]
public class

我认为应该匹配:

[attribute C]
[attribute B]
public class

如果我错了,请纠正我。我认为应该读取正则表达式的方式是:

查找属性( [ some attribute ] )或公共关键字或私有关键字或空格。

所以首先正则表达式引擎应该匹配 [attribute],然后是 '\n'(新行),然后是 public 关键字。在这些之后,关键字int不是一个选项,那为什么要匹配呢?

【问题讨论】:

  • 我强烈推荐 RegexBuddy,以防你还没有它。我与该产品没有任何关系;我就是喜欢它。

标签: c# regex parsing


【解决方案1】:

问题在于您使用的点匹配任何内容,包括右方括号、空格和(在单行模式下)换行符:

\[.+?\]

你应该改用这个:

\[[^\]]+\]

解释:

\[ 匹配文字左方括号。 [^\]] 匹配任何字符除了右方括号。 + 一个或多个。 \] 匹配文字右方括号。

【讨论】:

  • 是的,但我没有让它变得贪婪,这意味着它会一直持续到匹配 ']' 我想......为什么它匹配 public int a; 我仍然很困惑哈哈。 +1 让它发挥作用
  • 无论匹配成功还是失败,贪婪都不会改变。它只会改变搜索顺序。
  • 非常感谢。只要堆栈溢出允许我,我会接受你的回答
  • 据我所知,. 不匹配换行符(除非您使用 dotall 选项)。 . 匹配 \n 的语言是什么? (|\s) 表示它不会影响这个正则表达式。)
  • 我在开头使用选项 (?s) 使 . 匹配 \r\n 我拥有的另一个选项 (?m) 使正则表达式多行意味着 @ 987654332@ 将匹配新行的开头,$ 匹配行尾。在这种情况下,我同时使用这两种情况,所以我在正则表达式的开头有 (?sm)。
【解决方案2】:

使用这个Regex

((?<attribute>(?:public|private|\[[^\]]+\]))[\r\n\s]+)*class

并给出名为attribute 的组。你的代码可以是这样的:

foreach (Match match in Regex.Matches(inputString, @"((?<attribute>(?:public|private|\[[^\]]+\]))[\r\n\s]+)*class"))
{
    var attributes = new List<string>();
    foreach (Capture capture in match.Groups["attribute"].Captures)
    {
        attributes.Add(capture.Value);
    }
}

【讨论】:

  • 这行得通,但您没有对 OP 的正则表达式中的原始问题给出任何解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2022-01-04
  • 2015-01-16
  • 1970-01-01
相关资源
最近更新 更多