1

我有带有一些自定义标签的纯文本。例如:

I like C#. <code lang="C#">public static void main</code>
THis is good language.

我需要将所有不在标签内的空格替换为&nbsp;

替换后的文本必须是:

I&nbsp;like&nbsp;C#.&nbsp;<code lang="C#">public static void main</code>
THis&nbsp;is&nbsp;good&nbsp;language.
4

3 回答 3

2

如果你有有效的 XML 元素与文本混合,你可以使用 XML 解析类,例如 XDocument,你可以这样做:

        string input = @"I like C#. <code lang=""C#"">public static void main</code>THis is good language.";
        string rootedInput = String.Format("<root>{0}</root>", input);

        XDocument doc = XDocument.Parse(rootedInput);
        var nodes = doc.Root.DescendantNodes();

        StringBuilder sb = new StringBuilder();
        string nodeAsString = String.Empty;
        foreach (XNode node in nodes)
        {
            if (node.NodeType == XmlNodeType.Text)
                nodeAsString = node.ToString().Replace(" ", "&nbsp;");
            else
                nodeAsString = node.ToString();

            sb.Append(nodeAsString);
        }

        string newStr = sb.ToString();
于 2012-07-12T07:22:22.660 回答
1

如果标签不能包含其他标签,并且没有自闭合标签或其他奇怪的东西。这将起作用。

使用 perl 表示法

s/ (?![^>]*\<\/)/&nbsp;/g

这也假设文件格式正确,并且开始和结束标签在同一行(但您可以轻松地将其更改为多行正则表达式。)

以下是它的工作原理:

因为(如您所指出的)标签不能包含其他标签,所以在您不想替换的文本之后的某个时间点会有一个结束标签,所有结束标签都以</. 这将发生在下一个开始标记之前。另一方面,您确实要替换的文本将在下一个结束标记之前跟随一个开始标记。

所以这只是匹配一个空格,然后进行负前瞻,以确保下一次 a</出现在 a 之前>(或开始标签的结尾。如果这是真的,那么匹配不会发生并且空格是没有被替换。

这仅在标签不能包含其他标签时才有效。

于 2012-07-12T09:43:57.320 回答
0

一个简单的想法!这有效:

String ConvertString(String inputString)
{
    var first = new List<string>();
    var second = new List<string>();

    foreach (Match match in Regex.Matches(inputString, "(?<inTag><code[^>]+>[^<]*</code[^>]+>)"))
    {
        first.Add(match.Groups["inTag"].Value);
    }

    inputString = inputString.Replace(" ", "&nbsp;");

    foreach (Match match in Regex.Matches(inputString, "(?<inTag><code[^>]+>[^<]*</code[^>]+>)"))
    {
        second.Add(match.Groups["inTag"].Value);
    }

    for (int i = 0; i < first.Count(); i++)
    {
        inputString = inputString.Replace(second[i], first[i]);
    }

    return inputString;
}
于 2012-07-12T07:08:59.963 回答