正则表达式-返回引用以匹配完全匹配的第一个匹配项

问题描述

客观

将随后的强项和强调项合并为一个要素。输入以下字符串:

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<tag>)匹配同一元素(强项或重点)。上面的示例将导致匹配,但这不是因为强调和强标签都没有重复。

解决此问题的一种方法是先运行仅用于强势的表达式,然后仅运行用于强调的表达式。但是,这将导致更多的维护,更多的测试等,因此是不希望的。

感谢您提供的任何帮助。

解决方法

在我看来,您真正想要做的就是消除彼此相邻的任何闭合和断开标签。

在此:

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

您不想将第一个标签的内容与第二个标签的内容结合在一起。您只想摆脱中间的</strong><strong>

做类似的事情

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

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

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

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