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模式将在第一个</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#解析器进行斗争。