如何使用C#regex将输入文本标签替换为其纯文本的值?

时间:2014-10-10 08:09:29

标签: c# html regex

我有像

这样的html字符串
<td AutoTab="true" Compulsory="true" ValidationGroup="OU20141008-0001" class="bn_TextBox bn_TextBox_com i" class="r">
                <span id="FixedGrid1__txtSUPPLY_AMT_0_Container">
                <input AutoTab="true" Compulsory="true" ValidationGroup="OU20141008-0001" class="bn_TextBox bn_TextBox_com r ime-disabled" name="FixedGrid1$ctl11$_txtSUPPLY_AMT" type="text" value="900000" readonly="readonly" id="FixedGrid1__txtSUPPLY_AMT_0" style="color:0;background-color:0;width:96%;" />

                </span>
            </td><td class="r">
                <span id="FixedGrid1__txtM_AMT_0_Container"><input AutoTab="true" class="bn_TextBox r ime-disabled" name="FixedGrid1$ctl11$_txtM_AMT" type="text" value="818181" readonly="readonly" id="FixedGrid1__txtM_AMT_0" style="color:0;background-color:0;width:96%;" /></span>
            </td><td class="r">
                <span id="FixedGrid1__txtTAX_AMT_0_Container"><input AutoTab="true" Compulsory="true" ValidationGroup="OU20141008-0001" class="bn_TextBox bn_TextBox_com r ime-disabled" name="FixedGrid1$ctl11$_txtTAX_AMT" type="text" value="81818" readonly="readonly" id="FixedGrid1__txtTAX_AMT_0" style="color:0;background-color:0;width:96%;" /></span>
            </td><td class="c">2014-10-08</td><td>1111</td><td class="c">
                <span id="FixedGrid1_Label5_0_Container"><span id="FixedGrid1_Label5_0" class="bn_Label">2014-10-08</span></span>

            </td><td class="c">
                <span id="FixedGrid1_Label6_0_Container"><span id="FixedGrid1_Label6_0" class="bn_Label">2014-10-08</span></span>

            </td>

我需要将此input type = text html标记替换为其值的纯文本。

喜欢

<input AutoTab="true" Compulsory="true" ValidationGroup="OU20141008-0001" class="bn_TextBox bn_TextBox_com r ime-disabled" name="FixedGrid1$ctl11$_txtSUPPLY_AMT" type="text" value="900000" readonly="readonly" id="FixedGrid1__txtSUPPLY_AMT_0" style="color:0;background-color:0;width:96%;" />

这只剩下900000

我知道有HTML Agility包,它简单快捷。

但在这种情况下,我不能使用任何第三方库。

有人能帮忙吗?

2 个答案:

答案 0 :(得分:1)

您需要匹配整个输入,名称最好,因为这应该是唯一标记,但捕获值属性以用于替换。如果您使用ExplicitCapture,这会更简单一些,因此您可以在替换中使用捕获的名称 - 请参阅Substituting a Named Group on MSDN

总结正则表达式:

  1. \<input - 匹配代码的开头
  2. .*? - 匹配可能的最小字符以获取下一位(名称属性)
  3. name=""FixedGrid1\$ctl11\$_txtSUPPLY_AMT"" - 匹配名称标签
  4. .*? - 匹配可能的最小字符以获得下一位(值属性)
  5. value=""(?<val>[^""]*)"" - 匹配value属性并在val
  6. 中捕获其值
  7. .*? - 匹配可能的最小字符到达下一位(标记的末尾)
  8. \> - 匹配标记的结尾
  9. Regex.Replace(input, @"\<input.*?name=""FixedGrid1\$ctl11\$_txtSUPPLY_AMT"".*?value=""(?<val>[^""]*)"".*?\>", "${val}", RegexOptions.ExplicitCapture);

答案 1 :(得分:0)

以下正则表达式应该这样做(至少对于给定的示例):

<input.+(type="text"|value="(?<Val>[^"]+)").*/>

背后的逻辑如下:

  1. 匹配所有input代码
  2. 拥有属性type=textvalue=<something>,无论它们出现的顺序如何
  3. 捕获命名组value
  4. Val属性中的字符串
  5. 匹配input代码的其余部分。
  6. 现在,要替换只使用以下代码段:

    string value = @"${Val}";
    return myRegex.Replace(targetString, value);