2010-06-22 104 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