需要匹配句子的第一部分,最多匹配给定的单词。但是,该词是可选的,在这种情况下,我想匹配整个句子。例如:



在第一种情况下,我想要 "I have a sentence" 。在第二种情况下,我想要 "I have a sentence and I like it."
Lookarounds 会给我第一种情况,但是一旦我尝试使它成为可选的,以涵盖第二种情况,我就会得到整个第一句话。我试过让表达变得懒惰......没有骰子。

适用于第一种情况的代码:

var regEx = new Regex(@".*(?=with)");
string matchstr = @"I have a sentence with a clause I don't want";

if (regEx.IsMatch(matchstr)) {
    Console.WriteLine(regEx.Match(matchstr).Captures[0].Value);
    Console.WriteLine("Matched!");
}
else {
    Console.WriteLine("Not Matched : (");
}

我希望的表达方式:
var regEx = new Regex(@".*(?=with)?");

有什么建议么?

提前致谢!
詹姆士

最佳答案

有几种方法可以做到这一点。你可以这样做:

^(.*?)(with|$)

第一组不情愿地匹配,即尽可能少的字符。如果该组后跟 with$ anchor 行的末尾,则我们有一个整体匹配。

鉴于此输入:
I have a sentence with a clause I don't want.
I have a sentence and I like it.

然后有两个匹配项( as seen on rubular.com ):
  • 第 1 场比赛:
  • 组1:"I have a sentence "
  • 第 2 组:"with"
  • 第 2 场比赛:
  • 第 1 组: "I have a sentence and I like it"
  • 第 2 组:""(空字符串)

  • 如果您不需要区分这两种情况,您可以使用 (?:with|$) 使分组交替不捕获。

    相关问题
  • Difference between .*? and .* for regex
  • 10-07 12:55