【问题标题】:RegEx - Capturing multiple timesRegEx - 多次捕获
【发布时间】:2015-07-18 15:52:31
【问题描述】:

我目前正在尝试转换如下 HTML 表格:

<table>
    <tr>
        <td>
            Some Text
        </td>
        <td>
            <img src="..." ...>
        </td>
    </tr>
    ...
</table>

进入这样的 HTML 列表:

<ul>
    <li>
        <div>
            <p> Some Text </p>
        </div>
        <img src="..." ...>
    </li>
    ...
</ul>

由于我需要在多个文件(100+)中执行此操作,我想使用正则表达式来完成它。然而,虽然我能够捕捉到我感兴趣的部分,但它似乎只捕捉到了最后一次出现的捕捉组。

有没有办法取回所有捕获的部分?

这是我目前的进度:

<table>(?>\s*?<tr>\s*?<td>(.*?)<\/td>\s*?<td>.*?(<img[^>]*>).*?<\/td>.*?<\/tr>)+\s*?<\/table>

(如果你有兴趣,这里是一个摆弄的链接: https://regex101.com/r/hQ8pF1/2 )

我选择的编辑器是 Sublime Text(使用 PCRE 引擎 AFAIK),但我愿意使用任何东西来完成这项任务。

【问题讨论】:

  • 尝试使用正则表达式可能会证明非常具有挑战性,但如果您对输入有严格的规则,这是可能的。如果您在这些标签上有属性(其中一些包含&gt; 字符,或更复杂的场景),则更是如此。如果您可以访问 HTML 解析器,我肯定会推荐使用它,尽管性能存在差异。
  • @JánosWeisz 谢天谢地,我需要编辑的表格似乎非常相同(关于它们的结构)。不过感谢您提到 HTML 解析器,我可能会看一下。

标签: html regex sublimetext sublimetext3


【解决方案1】:

尝试使用TextCrawler 工具(仅限 Windows AFAIK)。它支持多个文件的正则表达式搜索和替换。匹配多次出现应该没问题。

您是否尝试过在没有“表”的情况下进行匹配?像这样https://regex101.com/r/hQ8pF1/3

【讨论】:

    【解决方案2】:

    \s*?&lt;tr&gt;\s*?&lt;td&gt;(.*?)&lt;\/td&gt;\s*?&lt;td&gt;.*?(&lt;img[^&gt;]*&gt;).*?&lt;\/td&gt;.*?&lt;\/tr&gt; w/ sig for options 应该这样做。

    Sample.

    【讨论】:

    • 谢谢,这绝对有帮助。有没有办法也可以替换周围的 标签?或者在第二次迭代中删除它们是否更容易,当然使用不同的 RegEx?
    • 是的,我认为单独的正则表达式是最简单的方法。
    猜你喜欢
    • 2015-11-27
    • 2019-10-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2013-07-17
    相关资源
    最近更新 更多