0

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

我正在尝试传递正则表达式以Regex.Match从文章中提取某些文本。如何在正则表达式中编写 if 条件?我阅读了这个正则表达式备忘单,根据它可以使用 来陈述条件<?()>,但没有给出示例。

例如,我有以下文字:

"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

4 回答 4

2

在这里试试这个:

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

您可以在这里在线试用:regexr.com?2thid

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

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

于 2011-04-13T08:38:01.110 回答
1

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

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

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

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

说了这么多,我认为stema建议的负面展望将更适合您正在尝试做的事情。

注意:“测试”部分也可以使用任何零宽度断言,例如负向查找。

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

当然,零宽度向前看是多余的,因为“测试”表达式总是被认为是零宽度。

于 2011-04-13T09:20:40.230 回答
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 只是一个速度修复。只需冲洗并重复其余物品

于 2011-04-13T08:31:29.000 回答
0

然后尝试使用该.Split()方法。拆分可能看起来像这个字符串

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];
}
于 2011-04-13T08:42:53.060 回答