正则表达式:当有两个模式时如何查找匹配,C#

3

我有以下两种模式,需要在字符串中查找匹配项,如果任何一个或两个都被找到,则继续查找下一个匹配项。

对于第一种模式,我一直在使用以下方法:

 MatchCollection m0 = Regex.Matches(file, @"<ul class=""Information"">[\s\n\t.]+<img src=""http://test/images/I/test.gif"">",
                   RegexOptions.Singleline);

然后循环匹配并提取我需要的细节。

我需要的第二个模式是

MatchCollection m1 = Regex.Matches(file, @"<ul class=""Information"">[\s\n\t.]+ <a href=""http://www.test.com/test/""\w+",
                   RegexOptions.Singleline);

在正则表达式中,是否可以将这些内容组合成一个搜索条件,例如使用OR?

2
为什么使用正则表达式来解析HTML如此诱人呢? - dtb
我最初只是想提取一个值,使用正则表达式快速简单,但现在需求已经改变,也许解析会更容易? - Standage
3
虽然我同意在大多数情况下不应该使用正则表达式,但对于非常简单的情况,它确实可以很好地工作。有时候,HTMLAgilityPack对于一些可以用简单的正则表达式快速解决的简单问题来说有些过度设计。 - Aren
@Aren 但是正则表达式也太过头了,因为它整个是一个引擎。 - Eder
@Eder:也许是这样,但人们对正则表达式的概念还是相当了解的。或者至少知道正则表达式的概念。指出可能有不同/更好的方法可能是值得的,但这不是他的问题,因为因为他这样想而羞辱他是没有建设性的,这就是我为什么要点名dtb的评论的原因。 - Aren
1个回答

4

免责声明

针对那些反感者,这并不是在问如何使用正则表达式解析HTML。他的问题实质上是想在正则表达式中寻找或的功能。

解决方法

虽然@dtb可能是对的,用正则表达式解析HTML,在简单情况下(输入小且模式简单),如果您知道何时使用它,这并不一定是个坏主意。

这是一个在正则表达式中简单的解决方案。

string pattern = @"<ul class=""Information"">[\s\n\t.]+" +
                 @"(?:<img src=""http://test/images/I/test.gif"">|" +
                 @"<a href=""http://www.test.com/test/""\w+)";

MatchCollection m0 = Regex.Matches(file, pattern, RegexOptions.Singleline);

在这里@Paul所做的是我们将匹配结果的末尾两个组件放入了一个非捕获组中:(?: )。这样可以确保它不会影响您的捕获组,但如果需要,您可以进行捕获。
然后我们使用OR运算符|将该组分成要么捕获其中一个,要么捕获另一个。
(?:<img src="http://test/images/I/test.gif">|<a href="http://www.test.com/test/"\w+)

以下是第二部分的匹配结果。

注意:如果您需要频繁执行此操作(例如循环),建议先编译正则表达式,这样可以提高执行效率。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接