正则表达式在两个特定字符串之间获取HTML

时间:2012-02-09 21:58:04

标签: c# regex

我对正则表达式并不是很精通,但我正在尝试在ASP.Net中完成一些我认为需要它们的东西。

我正在提取HTML文件,进行一些处理,并输出新的“合并”HTML。我正在努力的部分是抓住我自己创作的两个预定义“标签”之间的一大块代码。

以下是相关输入html的示例:

<table style="width: 500px; font-family: Trebuchet MS, sans-serif; font-size: 13px; background-color: #fff; border: 0; border-collapse: collapse;" align="center" cellspacing="0">
<thead>
<tr>
<th colspan="3" style="text-align: left;border-bottom: 1px solid #DDDDDD;">
Add-ons
</th>
</tr>
</thead>
<tbody>
[AddonsListSTART]
<tr style="border-bottom: 1px dashed #DDDDDD;">
<td>[AddonName]</td>
<td>[AddonQty]</td>
<td align="right">[AddOnPrice]</td>
</tr>
[AddonsListEND]
</tbody>
</table>
<br />

这是我的C#代码:

//Find Add-ons HTML : between [AddonsListSTART] & [AddonsListEND]
Regex rgxAddonSE = new Regex(@"\[AddonsListSTART\](?<MyHtml>.*)\[AddonsListEND\]");

Match matchAddonSE  = rgxAddonSE.Match(htmlEmail);

string htmlAddons = matchAddonSE.ToString();

我想要发生的是“htmlAddons”等于字符串:

<tr style="border-bottom: 1px dashed #DDDDDD;">
<td>[AddonName]</td>
<td>[AddonQty]</td>
<td align="right">[AddOnPrice]</td>
</tr>

问题是它始终为空白,并且“matchAddonSE.Success”始终为FALSE。我知道我的正则表达式有问题,但我无法弄清楚是什么。

提前感谢您的帮助。

石楠

2 个答案:

答案 0 :(得分:0)

我认为这可能与多线/单线处理有关。 考虑http://msdn.microsoft.com/en-us/library/yd1hzczs.aspx#Singleline

答案 1 :(得分:0)

问题是。*不包括新行。在文本中出现一次的这种预定义标签中的正则表达式(期望单一匹配)可能不是最好的方法,为什么不只是找到IndexOf并使用substring。

如果你仍然想使用正则表达式添加\ r \ n意味着[。\ r \ n] *使用\ s \ S会给你几乎相同的

\ s等同于[\ f \ n \ r \ t \ v]。

\ S等同于[^ \ f \ n \ r \ t \ t \ v]。

另一种选择是将正则表达式匹配设置为单行模式。 (名称令人困惑,但它实际上意味着它允许点“。”抓住新行)

下面是一个子字符串用法示例。

String startTag = "[AddonsListSTART]";
String endTag = "[AddonsListEND]"
int start = htmlEmail.IndexOf(startTag );
int end = htmlEmail.IndexOf(endTag);
String res ="";
if((start>=0) && (end>=0)){
  res = htmlEmail.substring(start + startTag.length,end - (start + startTag.length));
}

这是单行模式用法:(注意RegexOptions.Singleline)

//Find Add-ons HTML : between [AddonsListSTART] & [AddonsListEND]
Regex rgxAddonSE = new Regex(@"\[AddonsListSTART\](?<MyHtml>.*)\[AddonsListEND\]", RegexOptions.Singleline);

Match matchAddonSE  = rgxAddonSE.Match(htmlEmail);

string htmlAddons = matchAddonSE.ToString();

同样的事情,除了在模式

中使用单行模式
Regex rgxAddonSE = new Regex(@"(?s)\[AddonsListSTART\](?<MyHtml>.*)\[AddonsListEND\]");