Regex-Pattern使用(.+)查找自身的一部分

本文关键字:一部分 查找 使用 Regex-Pattern | 更新日期: 2023-09-27 18:09:14

在C#中,我有以下Regex模式(在HTML字符串上(:

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

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

我尝试过使用('w+),但它没有在标签中包含某些字符。

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

Regex-Pattern使用(.+)查找自身的一部分

以下Regex模式将在第一个</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来创建和测试您的正则表达式模式。

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

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

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

通过在集合[ ]中使用^字符(它是集合中的而不是(,我们有效地告诉解析器消耗,直到命中特定的字符集。

在您的情况下,更改

>(.+)</tr>

[^<]+,它说消耗所有直到(或除(<字符被击中一次或多次:

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

[^ ]集合的使用是一个强大的集合,我在90%的正则表达式模式中使用它,而不是用.+或更容易产生副作用的.*进行盲目消费。


此外,为了使您的模式更易于处理,请使用'x22代替",这样您就不会在正则表达式解析器之前与C#解析器进行斗争。