我在表格上有一个相当讨厌的字符串:
<aa>b</aa><ccc>ddd</ccc>
我希望所有代码都换成<td>
,所以我们会看到:
<td>b</td><td>ddd</td>
我怎样才能在C#中做到这一点?我猜regexp但不久之前我需要一些帮助。
答案 0 :(得分:2)
var startTag = new Regex(@"\<(?<tag>\w+)\s*\>");
var endTag = new Regex(@"\<\/\w+\>");
var result = startTag.Replace("<aa>b</aa><ccc>ddd</ccc>", "<td class=\"${tag}\">");
result = endTag.Replace(result,"</td>");
MSDN上的正则表达式替换http://msdn.microsoft.com/en-us/library/ewy2t5e0.aspx#Named
答案 1 :(得分:0)
看起来你正试图按摩一些类似XML的结构。是否有可能元素值中包含CDATA记录?如果是这样,不所需的正则表达式在CDATA部分内进行替换可能远高于我的工资等级。否则,@查理似乎有一个很好的答案!
如果可能存在包含内部标记的CDATA记录,您可以将该字符串作为XML使用并以此方式对其进行操作。根据您的示例,我将字符串片段包装在单个根元素中,以便将其解析为XElement,然后在重命名所有节点后将其解包。我不确定,不如第7个正式的正则大师那样聪明,但可能会帮助你。
编辑:基于希望输出字符串如下所示:<td class='aa'>b</td><td class='ccc'>ddd</td>
,那么XML处理绝对是最佳选择,恕我直言。
var s = @"<aa>b</aa><ccc>ddd</ccc>";
var prefix = "<wrapper>";
var suffix = "</wrapper>";
var wrapped = prefix + s + suffix;
var wrapper = XElement.Parse(wrapped);
foreach (var e in wrapper.Descendants())
{
e.Add(new XAttribute("class", e.Name));
e.Name = "td";
}
wrapped = wrapper.ToString(SaveOptions.DisableFormatting);
// extract the resulting string from the root element
var result = wrapped.Substring(prefix.Length, wrapped.Length - (prefix.Length + suffix.Length));
Console.WriteLine(result); // --> "<td class=\"aa\">b</td><td class=\"ccc\">ddd</td>"
这会产生<td class="aa">b</td><td class="ccc">ddd</td>
不幸的是,我不知道如何让XElement生成单引号而不是属性值的双引号。但是,两者都是有效的XML,所以也许并不重要。