需要帮助在字符串的特定部分中的每个字符后插入逗号

时间:2011-08-17 15:45:11

标签: c# .net

在我正在处理的程序中,我需要在字符串的某些部分周围剥离标记,然后在标记内的每个字符后面插入逗号(而不是在字符串中的任何其他字符之后)。如果这没有意义,这里有一个需要发生的事情的例子 -

这是一个带<的字符串。 a>标签< / a> (请忽略标签内的空格)

(需要成为)

这是一个带有t,a,g,。

的字符串

任何人都可以帮我吗?我已经设法使用RegEx剥离标记,但我无法弄清楚如何只在标记中包含的字符之后插入逗号。如果有人可以提供帮助那就太棒了。

@Dour High Arch我会详细说明一下。该代码适用于无法识别SSML标记的文本转语音应用。当用户输入文本到语音应用的消息时,他们可以选择将单词括在< a>标签让演讲者称世界为首字母缩略词。因为首字母缩略词SSML标记不起作用,我想删除< a>每当存在时标记,并在标记中包含的每个字符后面放置逗号来伪造它(例如:< a> test< / a>变为t,e,s,t,)。字符串中所有未标记的单词后面都不需要逗号,只需要包含在标记中的逗号(如果需要,请参阅我的第一个示例)。

3 个答案:

答案 0 :(得分:2)

如果你已经找到了正则表达式,我会想象捕获标签的内部文本会很简单。然后插入逗号是一个非常简单的操作:

  var commaString = string.Join(",", capturedString.ToList());

答案 1 :(得分:1)

假设您已经通过RegEx解析了目标字符串,即周围没有标签......

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication32
{
    class Program
    {
        static void Main(string[] args)
        {
            // setup a test string
            string stringToProcess = "Test";

            // actual solution here
            string result = String.Concat(stringToProcess.Select(c => c + ","));

            // results: T,e,s,t,
            Console.WriteLine(result);
        }
    }
}

答案 2 :(得分:0)

解析XML是非常有问题的,因为您可能必须处理诸如CDATA部分,嵌套元素,实体,代理字符以及on和on之类的内容。我会使用像ANTLR这样的基于状态的解析器。

但是,如果您刚开始使用C#,使用内置的.Net字符串和数组类来解决这个问题是有益的。不需要ANTLR,LINQ或正则表达式:

using System;

class ReplaceAContentsWithCommaSeparatedChars
{
    static readonly string acroStartTag = "<a>";
    static readonly string acroEndTag = "</a>";

    static void Main(string[] args)
    {
        string s = "Alpha <a>Beta</a> Gamma <a>Delta</a>";
        while (true)
        {
            int start = s.IndexOf(acroStartTag);
            if (start < 0)
                break;

            int end = s.IndexOf(acroEndTag, start + acroStartTag.Length);
            if (end < 0)
                end = s.Length;

            string contents = s.Substring(start + acroStartTag.Length, end - start - acroStartTag.Length);
            string[] chars = Array.ConvertAll<char, string>(contents.ToCharArray(), c => c.ToString());
            s = s.Substring(0, start)
                + string.Join(",", chars)
                + s.Substring(end + acroEndTag.Length);
        }

        Console.WriteLine(s);
    }
}

请注意,这并不涉及我提到的任何问题。但是,其他建议都没有。