我对正则表达式并不是很精通,但我正在尝试在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。我知道我的正则表达式有问题,但我无法弄清楚是什么。
提前感谢您的帮助。
石楠
答案 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\]");