2008年5月30日星期五

使用正则表达式

我在平时很少用到正则表达式,今天遇到一个特殊的需求:从数据库读取数据显示在一个表格中,如果要显示的数据是一段HTML并且包含背景颜色的样式设置,则最终页面显示的内容不能填满表格,就像下面的样子:

a 
客户要求整个单元格的背景都要变成红色,不能有白色的空隙部分。

本来打算通过样式表来控制使其充满整个单元格,但是失败了,因为很难控制要显示内容的高度和单元格一样高。

第二个方案是在绑定数据的时候判断数据是否包含“background-color”的样式,如果有就在单元格上添加相同的样式,于是就需要用正则表达式从读取的数据中提取“background-color: red;”

例如:

从数据库中读取的原始数据是: <p style="background-color: red; width: 10px;">TEST</p>

绑定到表格后应该是: <td style="background-color: red;"><p style="background-color: red; width: 10px;">TEST</p></td>

我设计的表达式是:background-color:\s*(?<color>.*?);

然后通过下面的代码把背景色应用到单元格中:

cell.Text = value.ToString();

// Check customized background color
// and then apply same color to cell
Regex rg = new Regex(@"background-color:\s*(?<color>.*?);", RegexOptions.IgnoreCase);
Match result = rg.Match(cell.Text);
if (result.Success && result.Groups["color"].Success)
{
    cell.Attributes.CssStyle.Add(HtmlTextWriterStyle.BackgroundColor, result.Groups["color"].Value);
}

在写这段代码之前我专门找了一些正则表达式的资料恶补一番,其中感觉最好的是deerchao正则表达式30分钟入门教程

正则表达式实在是太强大了!