我目前正在使用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
,我想我需要添加一个条件(.+?\.)+?
部分,对吗?如何在正则表达式中列出条件?
请帮助,谢谢!
答案 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];
}