-1

我在表单上有一个相当讨厌的字符串:

<aa>b</aa><ccc>ddd</ccc>

我想交换所有的标签,<td>所以我们会看到这个:

<td>b</td><td>ddd</td>

我怎么能在 C# 中做到这一点?我猜是正则表达式,但已经有一段时间了,所以我需要一些帮助。

4

2 回答 2

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

于 2012-08-09T02:48:43.247 回答
0

很久以前,我因 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,所以也许没关系。

于 2012-08-09T03:06:19.960 回答