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 要素とテキストが混在している場合は、XDocument などの XML 解析クラスを使用できます。次のように実行できます。

        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 >(または開始タグの末尾) の前にあることを確認するために、否定的な前方先読みを行います。それが true の場合、一致は発生せず、スペースは交換していません。

これは、タグに他のタグを含めることができない場合にのみ機能します。

于 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 に答える