在正则表达式中使用if子句

时间:2011-04-13 08:15:12

标签: regex vb.net textmatching

我目前正在使用vb.net编写.net windows应用程序。

我正在尝试将正则表达式传递给Regex.Match以从文章中提取某些文本。如何在正则表达式中编写if条件?我阅读this regular expression cheat sheet,根据该{{3}}可以使用<?()>说明条件,但没有给出示例。

例如,我有以下文字:

"Mary have banana. Mary have apple. Mary have NO pear."

我可以使用以下表达式来取出(1)banana,(2)apple和(3)NO pear

mary have (.+?\.)+?

但是,如果我只想提取mary所拥有的果实,即(1)banana和(2)apple,我想我需要添加一个条件(.+?\.)+?部分,对吗?如何在正则表达式中列出条件?

请帮助,谢谢!

4 个答案:

答案 0 :(得分:2)

在此尝试:

Mary\shave\s(?!NO)(\S*)

您可以在此处在线试用:regexr.com?2thid

第一部分是负前瞻断言,这意味着如果“玛丽没有”,这个正则表达式将不匹配。否则它会将“Mary have”之后的单词放入第一个捕获组。

Here in the Perlretut(假设它与.net相同)解释了条件部分,但我认为我的解决方案更简单。

答案 1 :(得分:1)

其他人已经为您的具体案例提供了解决方案,因此我将只关注标题中提到的“if子句”。

.NET支持使用以下模式的条件。

(?(bob)[a-z]+|[0-9]+)

正则表达式将首先尝试匹配文本表达式(内括号中的部分),如果匹配则全部表达式将尝试使用管道前的子表达式匹配([a-z]+)否则它将尝试使用管道([0-9]+)之后的子表达式进行匹配。

说了这么多,我认为stema建议的负面展望会更适合你想做的事情。

注意:“test”部分也可以使用任何零宽度断言,例如背后的负面看法。

(?(?<!\s)[a-z]+|[0-9]+)

当然,零宽度前瞻是多余的,因为“测试”表达式始终被视为零宽度。

答案 2 :(得分:0)

这是一个可以在没有正则表达式麻烦的情况下使用的解决方案,但我只能在C#中回答

    string sentence = "Mary have banana Mary have apple Mary have NO pear";
    if (sentence.Contains("banana"))
    {
        string x= sentence.Remove(sentence.IndexOf("banana"),"banana".Length);
    }

不要笑XD只是一个speedfix。只需冲洗并重复其余项目

答案 3 :(得分:0)

然后尝试使用.Split()方法。拆分可能看起来像thisstring

sentence = "Mary have banana Mary have apple Mary have NO pear"; 
string[] brokenUp = sentence.Split(
      new String[] 
      { 
          "first fruit as string variable", 
          "second fruit as string variable", 
          "third fruit as string variable" 
      }, 
      StringSplitOptions.None
);
string newSentence = null;
for (int i = 0; i < brokenUp.Length; i++)
{
    newSentence += brokenUp[i];
}