【问题标题】:Regular expression - back reference to match exact first match正则表达式 - 反向引用以匹配第一个匹配项
【发布时间】:2020-12-03 13:21:40
【问题描述】:

目标

将后续的强元素和强调元素组合成一个元素。取以下字符串:

This is a <strong>test</strong><strong>string</strong>.

我需要做的是用一个标签替换两个强标签。上面应该变成:

This is a <strong>teststring</strong>.

到目前为止,我有以下正则表达式可以实现这个目标:

(?<values>(\<(?<tag>emphasis|strong)\>([^\<]+)\<\/\k<tag>\>){2,}?)

问题

获取以下测试字符串:

This is <emphasis>a</emphasis><strong>b</strong>.

它将第一个强调标签与最后一个强标签匹配。然而,这不是期望的行为。我需要的是正则表达式匹配强或强调,然后反向引用(\k&lt;tag&gt;)匹配相同的元素(强或强调)。上面的示例将导致匹配,但它不应该因为强调和强标签都没有重复。

解决此问题的一种方法是首先运行一个仅表示强的表达式,然后运行另一个仅表示强调的表达式。但是,这将导致更多的维护、额外的测试等,因此是不可取的。

感谢您提供的任何帮助。

【问题讨论】:

    标签: regex html-parsing


    【解决方案1】:

    在我看来,您真正想要做的是消除任何彼此相邻的结束标签和开始标签。

    在这个:

    This is a <strong>test</strong><strong>string</strong>.
    

    您不想将第一个标签的内容与第二个标签的内容结合起来。你只是想摆脱中间的&lt;/strong&gt;&lt;strong&gt;

    所以做一些类似的事情

    s/<\/(\w+)><\1>//;
    

    如果您想将其限制为某些标签,请执行以下操作:

    s/<\/(strong|emphasis)><\1>//;
    

    (您没有指定您使用的语言,所以我使用了sed 替换。)

    【讨论】:

    • 完美!有时它只是有助于让第二双眼睛关注一个问题。谢谢。
    猜你喜欢
    • 2020-07-02
    • 1970-01-01
    • 2018-11-25
    • 2011-06-17
    • 2013-10-04
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    相关资源
    最近更新 更多