正则表达式:匹配可选单词

Jam*_*ing 7 c# regex

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

我有一句话,附有我不想要的条款.

我有一句话,我喜欢它.

在第一种情况下,我想要"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 : (");
}
Run Code Online (Sandbox Code Playgroud)

我希望的表达方式:

var regEx = new Regex(@".*(?=with)?");
Run Code Online (Sandbox Code Playgroud)


有什么建议?

提前致谢!
詹姆士

pol*_*nts 11

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

^(.*?)(with|$)
Run Code Online (Sandbox Code Playgroud)

第一组不情愿地匹配,即尽可能少的字符.如果该组后面跟着或者with是线$ 的末尾,我们有一个整体匹配.

鉴于此输入:

I have a sentence with a clause I don't want.
I have a sentence and I like it.
Run Code Online (Sandbox Code Playgroud)

然后有两个匹配(如rubular.com上所示):

  • 比赛1:
    • 第1组: "I have a sentence "
    • 第2组: "with"
  • 比赛2:
    • 第1组:"I have a sentence and I like it".
    • 第2组:( ""空字符串)

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

相关问题