正则表达式表现得很懒,应该是贪心的

Sto*_*omp 10 regex greedy non-greedy alternation regex-greedy

我认为默认情况下我的正则表达式会展示我想要的贪婪行为,但它不在以下代码中:

 Regex keywords = new Regex(@"in|int|into|internal|interface");
 var targets = keywords.ToString().Split('|');
 foreach (string t in targets)
    {
    Match match = keywords.Match(t);
    Console.WriteLine("Matched {0,-9} with {1}", t, match.Value);
    }
Run Code Online (Sandbox Code Playgroud)

输出:

Matched in        with in
Matched int       with in
Matched into      with in
Matched internal  with in
Matched interface with in
Run Code Online (Sandbox Code Playgroud)

现在我意识到,如果我只是按照长度降序对关键字进行排序,我可以让它为这个小例子工作

  • 我想知道为什么这不能按预期工作,并且
  • 我正在处理的实际项目在正则表达式中有更多的单词,并且按字母顺序保留它们非常重要.

所以我的问题是:为什么这是懒惰的,我该如何解决?

Max*_*keh 12

懒惰和贪婪仅适用于量词(?,*,+,{min,max}).轮换总是按顺序匹配并尝试第一个可能的匹配.


Jas*_*n D 6

看起来你正试图说出破碎的东西.要做到这一点,你需要整个表达式是正确的,你当前的表达式不是.试试这个......

new Regex(@"\b(in|int|into|internal|interface)\b");
Run Code Online (Sandbox Code Playgroud)

"\ b"表示匹配字边界,并且是零宽度匹配.这是依赖于语言环境的行为,但通常这意味着空格和标点符号.作为零宽度匹配,它将不包含导致正则表达式引擎检测字边界的字符.