2010-06-22 103 views
0

我需要替换所有匹配的实例,但只能在特定的标签内。正则表达式全部替换一组标签

例如,考虑具有这些标记我需要更换的所有次数内<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> 

我知道我可能是因为复杂的东西,但正则表达式就像我的大脑里的水 - 他们只是不混合。

回答

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只是想到什么。)

+0

感谢您的信息。当我在.NET中编写我的应用程序时,我的正则表达式测试程序应用程序不能用.NET编写,因为我没有看到这种行为。 – NFX 2010-06-22 16:44:33

0

这需要回顾后和预读。无限重复只适用于.net BTW。 尝试使用这样的:

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

第一次捕捉将匹配以一个<体>标签,一切都到嵌入标签统计的任何事情,但捕获具有零宽度。第三个对于结束标签也是一样,但是会匹配结束标签。

+0

这很好。 – NFX 2010-06-22 16:04:18