2011-11-28 45 views
1

我希望這不是一個重複內更換的話...使用正則表達式來一個子匹配

我需要一個正則表達式做什麼應該是一個相當簡單的任務。我有一個HTML表的代碼,我要全部更換<td>標籤與標籤<th>表,即第一行中的第一套<tr></tr>標籤內。該表可能是這個樣子:

<table cellpadding="5" cellspacing="0" border="1"> 
<tr> 
<td>Capacity %</td> 
<td>Tension V</td> 
<td>Acid kg/l</td> 
</tr> 
<tr> 
<td>100</td> 
<td>12.70</td> 
<td>1.265</td> 
</tr>...etc 

,我想:類似這樣的

<table cellpadding="5" cellspacing="0" border="1"> 
<tr> 
<th>Capacity %</th> 
<th>Tension V</th> 
<th>Acid kg/l</th> 
</tr> 
<tr> 
<td>100</td> 
<td>12.70</td> 
<td>1.265</td> 
</tr>...etc 

我已經試過正則表達式:

/(<table>\n<tr>\n)(.+?)(</tr>) 

...然後試圖重建使用背面的表格行的引用,但我似乎不能以正則表達式應用到多個 < /?TD> 匹配,有可能是。

我在JavaScript這樣做,這意味着我不能使用查找屁股(雖然如果任何人有解決方案背後一看,我會希望看到它無論如何...)。

在此先感謝您的幫助。

回答

1

如果您正則表達式引擎支持後向斷言無限期內重複,例如在.NET(C#),你可以做到這一點:

resultString = Regex.Replace(subjectString, 
    @"(?<=  # Assert that we can match this before the current position: 
    <table  # <table 
    (?:  # followed by... 
     (?!  # (unless there's an intervening 
     </table # </table 
     |   # or 
     </tr  # </tr) 
    )   # (End of lookahead assertion) 
     .   # any character 
    )*   # any number of times 
    )   # (End of lookbehind assertion) 
    <td   # Then match <td", 
    "<th", RegexOptions.Singleline | RegexOptions.IgnorePatternWhitespace); 

上你的榜樣作品。但即使在.NET中,我也不會使用正則表達式,它太脆弱了。直接更好地操作DOM,這就是它的目的。

+0

非常感謝這個蒂姆 - 看起來都很精明。我不確定如何使用JavaScript的正則表達式引擎來做這種背後的事情,但它確實是一個很好的解決方案。正如你所說,可能是最好的操縱DOM,或者像斯蒂芬格羅斯提到的那樣,第二個正則表達式。感謝你們兩位。 – MJA

+0

你不能用JavaScript做它,即使不與舊的「反向的字符串,然後用前瞻而不是」招,因爲它也使用前瞻。 –

0

你不能用一個單一的正則表達式做到這一點。由於正則表達式的基本工作原理行由行,和你有一個特殊的條件(「僅在第一次」),你需要寫一些有條件的邏輯與正則表達式一起,使其工作。

+0

事實並非如此。像.NET這樣的現代正則表達式在單一操作中沒有問題。 –

+0

我學到新的東西今天:) –