groovy 正则表达式:在html标记之间查找定义的字符串

xggvc2p6  于 2022-11-01  发布在  其他
关注(0)|答案(1)|浏览(117)

从Jenkins,我使用Confluence API获取HTML格式的页面内容,如下所示:

<tr>
        <td>Bla1</td>
        <td>1</td>
        <td colspan="1">
            <div class="content-wrapper"><p><time datetime="2022-07-25" />&nbsp;</p>
            </div>
        </td>
    </tr>
    <tr>
        <td colspan="1">what I’m searching</td>
        <td colspan="1">2</td>
        <td colspan="1">
            <div class="content-wrapper"><p><time datetime="2022-07-25" />&nbsp;</p></div>
        </td>
    </tr>
    <tr>
        <td colspan="1">Bla3</td>
        <td colspan="1">3</td>
        <td colspan="1">
            <div class="content-wrapper"><p><time datetime="2022-07-25" />&nbsp;</p></div>
        </td>
    </tr>

我想要更新一个表中特定行的内容,在这里我只知道一个字符串的值,在这个例子中是“我正在搜索的内容”,所以我需要一个正则表达式来匹配表行中的所有内容和搜索的字符串:

<tr> ... what I’m searching</td> ... </td> .(after 90 till 100 char). </td></tr>

也匹配两次</td>,一次是在长度为90到100个字符的</td></tr>之后结束,并返回整个行,如下所示:

<tr>
    <td colspan="1">what I’m searching</td>
    <td colspan="1">2</td><td colspan="1">
        <div class="content-wrapper"><p><time datetime="2022-07-25" />&nbsp;</p></div>
    </td>
</tr>
kxe2p93d

kxe2p93d1#

对于像您这样相当简单的查找,您实际上不必使用任何外部工具,一个简单的正则表达式就可以了。
此外,它的性能将更高,资源消耗也更少。
我会这么说:

String txt = '''\
<tr>
  <td>bla1a</td>
  <td>bla2a</td>
  <td>bla3a</td>
</tr>
<tr>
  <td>bla1b</td>
  <td>what I’m searching</td>
  <td>bla3b</td>
</tr>
<tr>
  <td>bla1c</td>
  <td>bla2c</td>
  <td>bla3c</td>
</tr>'''

List res = ( txt =~ /(?s)<tr>(\s*<td>[\w\s]+<\/td>\s*)*<td>what I’m searching<\/td>(\s*<td>[\w\s]+<\/td>\s*)*<\/tr>/ ).findAll()*.first()

assert res == ['''<tr>
  <td>bla1b</td>
  <td>what I’m searching</td>
  <td>bla3b</td>
</tr>''']

相关问题