正则表达式 - 模式用(。+)查找自身的一部分

时间:2015-08-23 10:50:58

标签: c# .net regex

在C#中,我有以下正则表达式模式(在HTML字符串上):

Regex TR = new Regex(@"<tr class=""(\w+)""  rel=""(\w+)"">(.+)</tr>");

问题是,当我运行它时,匹配包括HTML代码中最后</tr>次出现之前的所有内容。代码中有许多<tr>个代码,因此(.+)模式包含它们,仅在最后一次出现</tr>时停止。

我尝试使用(\w+)代替,但它并没有在代码中找到某些字符。

那么如何让这个模式在第一个</tr>停止,而不是直到代码中的最后一个?

2 个答案:

答案 0 :(得分:0)

以下正则表达式模式将停在第一个</tr>标记处:

<tr(\s+)class(\s*)=(\s*)"[^"]*"(\s+)rel(\s*)=(\s*)"[^"]*"(\s*)>(.(?!<\/tr>))*[\s\S]<\/tr>

您可以将代码更改为以下内容以获得所需内容:

Regex TR = new Regex(@"<tr class=""(\w+)""  rel=""(\w+)"">(.(?!<\/tr>))*[\s\S]</tr>");

(?!ABC)被称为否定前瞻。它指定在主表达式之后无法匹配的组(如果匹配,则结果将被丢弃)。

供将来参考:尝试使用RegExr创建和测试正则表达式模式。

答案 1 :(得分:-1)

> So how can I make this pattern stop at the first </tr>

最有效的捕获过程范例是不盲目消费,而是消耗已知的东西。

由于要抓取的文本属于><的锚点,为什么不使用结束锚的那个逻辑<来为正则表达式解析器提供一个提示?

通过在集^中使用[ ]字符( > },我们有效地告诉解析器消耗直到击中一组特定的角色。

在你的情况下改变

>(.+)</tr>

[^<]+,表示在<字符被点击之前消耗所有内容(或者除外),一次或多次:

>([^<]+)</tr>

[^ ]集的使用是一个功能强大的集合,我在90%的正则表达式模式中使用它而不是使用.+进行炫目,或者更多的侧面影响.*

另外,为了使您的模式更容易处理,请使用\x22代替",这样您就不会在正则表达式解析器之前使用C#解析器。