0

我的正则表达式有什么问题?

"/Blabla\(2\)&nbsp;:.*<tr><td class=\"generic\">(.*)<\/td>.+<\/tr>/Uis"

……

<tr>
<td class="aaa">Blabla(1)&nbsp;:</td>
<td>
<table class="bbb"><tbody>
<tr class="ccc"><th>title1</th><th>title2</th><th>title3</th></tr>
<tr><td class="generic">word1</td><td class="generic">word2 </td><td class="generic">word3</td></tr>
<tr><td class="generic">word4</td><td class="generic">word5 </td><td class="generic">word6</td></tr>
</tbody></table>
</td>
</tr>

<tr>
<td class="aaa">Blabla(2)&nbsp;:</td>
<td>
<table class="bbb"><tbody>
<tr class="ccc"><th>title1</th><th>title2</th><th>title3</th></tr>
<tr><td class="generic">word1b</td><td class="generic">word2b </td><td class="generic">word3b</td></tr>
<tr><td class="generic">word4b</td><td class="generic">word5b </td><td class="generic">word6b</td></tr>
</tbody></table>
</td>
</tr

我想要做的是从以 Blabla(2) 开头的块中获取每个 TR 的 FIRST TD 的内容。

所以预期的答案是 word1b AND word4b 但只返回第一个......

谢谢您的帮助。请不要回答我使用 DOM 导航器,在我的情况下这是不可能的。

4

2 回答 2

1

这是一个有趣的正则表达式,我在其中了解到了不贪婪的标志,很好!

对于您的问题,假设 PCRE 引擎,您可能会\G在上一个 match 和 flag 之后立即使用 match :g

/(?:Blabla\(2\)&nbsp;:|(?<!^)\G).*<tr><td class=\"generic\">(.*)<\/td>.+<\/tr>/Uisg

正则表达式101演示

或者使用不同的分隔符更短一些:

'~(?:Blabla\(2\)&nbsp;:|(?<!^)\G).*<tr><td class="generic">(.*)</td>.+</tr>~Uisg'
于 2013-10-02T17:16:56.183 回答
0

感谢@Jerry,我今天学到了新技巧:

(Blabla\(2\)&nbsp;:.*?|\G)<tr><td class=\"generic\">\K([^<]+).+?<\/tr>\r\n
于 2013-10-02T17:24:22.120 回答