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

时间:2016-03-02 14:11:05

标签: regex

我很难建立一个正则表达式 假设有一个html剪辑如下。
我想使用Javascript来剪切<tbody>部分,其链接为&#34; apple&#34;(<a>位于<td class="by">内) 我构造了以下表达式:

/<tbody.*?text[\s\S]*?<td class="by"[\s\S]*?<a.*?>apple<\/a>[\s\S]*?<\/tbody>/g

但结果与我想要的结果不同。每个匹配包含多个<tbody>块。怎么样?问候!!!!  (我用https://regex101.com/进行了测试,得到了意想不到的选择。请原谅我,我无法解决问题:()

   <tbody id="text_0">
        <td class="by">
                ...lots of other tags
            <a href="xxx">cat</a>
               ...lots of other tags
        </td>
    </tbody>
    <tbody id="text_1">
               ...lots of other tags
        <td class="by">
            <a href="xxx">apple</a>
        </td>
               ...lots of other tags
    </tbody>
    <tbody id="text_2">
               ...lots of other tags
        <td class="by">
            <a href="xxx">cat</a>
        </td>
               ...lots of other tags
    </tbody>
    <tbody id="text_3">
               ...lots of other tags
        <td class="by">
               ...lots of other tags
            <a href="xxx">tiger</a>
        </td>
               ...lots of other tags
    </tbody>
    <tbody id="text_4">
        <td class="by">
            <a href="xxx">banana</a>
        </td>
    </tbody>
    <tbody id="text_5">
        <td class="by">
            <a href="xxx">peach</a>
        </td>
    </tbody>
    <tbody id="text_6">
        <td class="by">
            <a href="xxx">apple</a>
        </td>
    </tbody>
    <tbody id="text_7">
        <td class="by">
            <a href="xxx">banana</a>
        </td>
    </tbody>

这就是我期望得到的

<tbody id="text_1">
    <td class="by">
        <a href="xxx">apple</a>
    </td>
</tbody>
<tbody id="text_6">
    <td class="by">
        <a href="xxx">apple</a>
    </td>
</tbody>

3 个答案:

答案 0 :(得分:0)

从这个正常工作的正则表达式开始,然后从那里开始:

/<a href="(.*?)">apple<\/a>/g

如果它太宽泛而你想让它更具体,请添加下一个标记:

/<td.*?>\s*<a href="(.*?)">apple<\/a>/g

然后继续:

/<tbody.*?>\s*<td.*?>\s*<a href="(.*?)">apple<\/a>/g

另外,请考虑替代解决方案,例如XPATH。正则表达式无法真正解析HTML的所有变体。

答案 1 :(得分:0)

这不是问题正则表达式部分的答案,但td元素不应嵌入tr元素中吗? tr代表“表格行”,而tbody代表“表格体”。 tbody通常将表行分组。不禁止在同一个表中有多个tbody,但通常没有必要。 (tbody实际上是可选的;您可以直接在tr元素中添加table。)

答案 2 :(得分:0)

首先,Regex不是解析HTML或XML之类的好方法。

我可以修复您的模式以使用此特定示例,但我无法保证它在所有情况下都能正常工作。正则表达式不适合这项工作。

但无论如何,请使用[\s\S]替换模式中[^<]的前2个实例。

<tbody.*?text[^<]*?<td class="by"[^<]*?<a.*?>apple<\/a>[\s\S]*?</tbody>