使用REGEX替换子匹配中的单词

时间:2011-11-28 15:13:55

标签: regex

我希望这不是重复...

我需要一个正则表达式才能做一个相当简单的任务。我有HTML表格的代码,我希望在表格的第一行中使用<td>代码替换所有<th>代码,即在第一组<tr> {{1}内}标签。该表可能如下所示:

</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

...然后尝试使用后引用重建表行,但我似乎无法将正则表达式应用于多个     &LT; / TD&GT; 可能存在的匹配。

我在javascript中这样做,这意味着我不能使用后视镜(虽然如果有人看看后面的解决方案我仍然有兴趣看到它...)。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果你的正则表达式引擎在lookbehind断言中支持无限重复,你可以这样做,例如在.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,这就是它的用途。

答案 1 :(得分:0)

单个正则表达式无法做到这一点。由于正则表达式基本上是逐行工作的,并且你有一个特殊的条件(“只在第一个”),你需要编写一些条件逻辑和正则表达式来使它工作。