正则表达式替换一组标签内的所有内容

时间:2010-06-22 01:21:01

标签: .net regex

我需要替换匹配的所有实例,但仅限于某些标记内。

例如,考虑一个具有<body>...</body>

的HTML页面

在这些标签中我需要替换所有出现的说法:

{embed=xxx}

<a href="xxx">xxx</a>

我可以使用类似(尝试#1)的方式为整个页面执行此操作:

match={embed=(.*?)}
replace=<a href="$1">$1</a>

但这取代了页面的所有部分,甚至是我不希望它被替换的部分,特别是头部。

当我尝试在上面定义的匹配项周围添加条件时(尝试#2):

match=(<body.*?)(?:({embed=(.*?)})+)(.*?)(</body)
replace=$1<a href="$3">$3</a>$4$5

如果只替换第一项。

因此,如果我使用此示例文本数据进行搜索:

<head>
{embed=zzz}
</head>
<body>
{embed=aaa}<br />
{embed=bbb}<br />
{embed=ccc}<br />
</body>

我明白了:

<head>
{embed=zzz}
</head>
<body>
<a href="aaa">aaa</a>aaa<br />
{embed=bbb}<br />
{embed=ccc}<br />
</body>

理想情况下,我想要的输出是:

<head>
{embed=zzz}
</head>
<body>
<a href="aaa">aaa</a><br />
<a href="bbb">bbb</a><br />
<a href="ccc">ccc</a><br />
</body>

我知道我可能过于复杂化,但正则表达式就像是我大脑的水 - 他们只是不混合。

2 个答案:

答案 0 :(得分:0)

您正在寻找的.NET方法是System.Text.Regular Expressions.Regex.Replace(InputString, ReplacementString)

这将用正则表达式替换字符串替换输入字符串中模式的所有匹配。

示例用法:

Dim regex As New System.Text.Regular Expressions.Regex("(<body.*?)(?:({embed=(.*?)})+)(.*?)(</body)")
Dim newString = regex.Replace(inputString, "$1<a href=""$3"">$3</a>$4$5")

文档为here

(对于Visual Basic示例感到抱歉。提到.NET时会想到这一点。)

答案 1 :(得分:0)

这需要lookbehind和lookahead。无限重复仅适用于.net BTW。 试试这个:

match=(?<=<body[^>]*>.*){embed=(.*?)}(?=.*</body>)

第一次捕获将匹配任何具有&lt; body&gt;的统计信息。标记和嵌入标记的所有内容,但捕获的宽度为零。第三个对结束标记执行相同操作,但会匹配结尾标记的内容。