【问题标题】:Regex ? in lookbehind not consuming正则表达式?回顾不消费
【发布时间】:2013-04-01 13:02:03
【问题描述】:

向后看?没有消耗 :

正则表达式:

(?i)(?<=\bsubject:?).+$

文字:

主题:asdf adsf

匹配

: asdf adsf

我不希望 : 包含在匹配项中

如果我搜索:
主题 asdf adsf
它匹配:
asdf 广告
这就是我想要的行为
它似乎将 : 视为可选但不消耗

如果我只匹配主题:?它是贪婪的,包括 :

【问题讨论】:

  • 您的示例并没有清楚地表明前瞻是必要的。你确定是吗?

标签: .net regex lookahead


【解决方案1】:

使用这个正则表达式(?i)(?&lt;=\bsubject:?)[^:].*$

【讨论】:

  • @Blam .+ 捕获 : 但不向后看
  • 您应该在回答中包含该解释。
【解决方案2】:

您在 : 后面有一个问号,这将使冒号成为可选的。

(?i)(?<=\bsubject:).+$

【讨论】:

  • 正是我希望它是可选的。我也希望它能够消耗。
【解决方案3】:

这对我来说没问题:

(?i)(?&lt;=subject:).+$

去掉多余的问号。

【讨论】:

  • 但我希望它是可选的。这与主题 asdf adsf 不匹配。
【解决方案4】:

除非我有误解,否则我认为您不需要对此进行展望?

如果您只是关注Subject 之后的内容,那么这就是您的正则表达式:

Subject\:?(.+)$

如果您追求Subjectsubject 或例如suBject 之后的任何内容,那么这就是您的正则表达式:

(?i)Subject\:?(.+)$

如果仍然有必要,请再次包含您的单词边界 \b

\bSubject\:?(.+)$(?i)\bSubject\:?(.+)$

所以,在 C#.NET 中:

Regex r = new Regex(@"(?i)Subject\:?(.+)$");

Match m = r.Match("Subject asdf asdf");
Console.WriteLine(m.Groups[1]);

m = r.Match("Subject: asdf asdf");
Console.WriteLine(m.Groups[1]); 

//Both output ' asdf asdf' - you might want to trim this.  
//Or add optional space \s? after the optional colon \:? in your regex.

或者,与其依靠魔术常量来与隐式编号的捕获组对齐,不如显式命名(和引用)该组:

string captureName = "yourcap";

Regex r = new Regex(@"(?i)Subject\:?(?<"+captureName+">.+)$");
Match m = r.Match("Subject asdf asdf");
Console.WriteLine(m.Groups[captureName]);

【讨论】:

  • 但我希望 : 是可选的(并且消耗)
  • @Blam 很清楚,如果: 紧跟在Subject 之后,那很好,但您不希望它包含在您的比赛中?已更新答案以反映这一点。
  • 可选的哪一部分不清楚?我希望它与主题 asdf adsf 匹配。
  • @Blam It IS 在这个正则表达式中是可选的。我要问的是如果: 存在,你希望它包含在匹配中吗?就目前而言,这个 WILL 匹配“Subject asdf adsf”(“asdf asdf”将被捕获),它 WILL ALSO 匹配“Subject: asdf asdf”(再次,“ asdf asdf”将被捕获)。
  • 我的评论是基于不带 ? 的早期版本。您修复包括主题:在匹配。我不想让主题出现在比赛中。这就是后视的目的。
猜你喜欢
  • 1970-01-01
  • 2023-02-22
  • 2018-01-02
  • 2012-02-27
  • 1970-01-01
  • 2021-03-21
  • 2015-11-21
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多