在C#中,我有以下正则表达式模式(在HTML字符串上):
Regex TR = new Regex(@"<tr class=""(\w+)"" rel=""(\w+)"">(.+)</tr>");
问题是,当我运行它时,匹配包括HTML代码中最后</tr>
次出现之前的所有内容。代码中有许多<tr>
个代码,因此(.+)
模式包含它们,仅在最后一次出现</tr>
时停止。
我尝试使用(\w+)
代替,但它并没有在代码中找到某些字符。
那么如何让这个模式在第一个</tr>
停止,而不是直到代码中的最后一个?
答案 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#解析器。