我需要替换匹配的所有实例,但仅限于某些标记内。
例如,考虑一个具有<body>...</body>
在这些标签中我需要替换所有出现的说法:
{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>
我知道我可能过于复杂化,但正则表达式就像是我大脑的水 - 他们只是不混合。
答案 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;的统计信息。标记和嵌入标记的所有内容,但捕获的宽度为零。第三个对结束标记执行相同操作,但会匹配结尾标记的内容。