我在表单上有一个相当讨厌的字符串:
<aa>b</aa><ccc>ddd</ccc>
我想交换所有的标签,<td>
所以我们会看到这个:
<td>b</td><td>ddd</td>
我怎么能在 C# 中做到这一点?我猜是正则表达式,但已经有一段时间了,所以我需要一些帮助。
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
很久以前,我因 Kessel 系统中的一些有限自动机而失去了我的正则表达式黑带。
看起来您正在尝试修改一些类似 XML 的结构。元素值中是否有可能包含 CDATA 记录?如果是这样,在 CDATA 部分内不进行替换所需的正则表达式可能远高于我的工资等级。否则,@Charlie 似乎有一个很好的答案!
如果可能存在包含内部标记的 CDATA 记录,则您可以将字符串作为 XML 使用并以这种方式对其进行操作。根据您的示例,我将字符串片段包装在单个根元素中,以便将其解析为 XElement,然后在重命名所有节点后将其解包。我敢肯定,它不如某些 7-th dan regex-fu 大师聪明,但可能会对您有所帮助。
编辑:基于希望输出字符串是这样的: <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,所以也许没关系。