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

C# 需要帮助在字符串特定部分的每个字符后插入逗号吗,c#,.net,C#,.net,在我正在使用的程序中,我需要在字符串的某些部分周围去掉标记,然后在标记中的每个字符后插入逗号(而不是在字符串中的任何其他字符后)。如果这没有意义,这里有一个需要发生什么的例子- 这是一个带有标记的字符串(请忽略标记中的空格) (需要成为) 这是一个带t,a,g的字符串 有人能帮我吗?我已经使用正则表达式成功地去除了标记,但我不知道如何仅在标记中包含的字符之后插入逗号。如果有人能帮忙,那就太好了 @阴沉的高拱门我会详细阐述一下。该代码适用于无法识别SSML标记的文本到语音应用程序。当用户为text

在我正在使用的程序中,我需要在字符串的某些部分周围去掉标记,然后在标记中的每个字符后插入逗号(而不是在字符串中的任何其他字符后)。如果这没有意义,这里有一个需要发生什么的例子-

这是一个带有标记的字符串(请忽略标记中的空格)

(需要成为)

这是一个带t,a,g的字符串

有人能帮我吗?我已经使用正则表达式成功地去除了标记,但我不知道如何仅在标记中包含的字符之后插入逗号。如果有人能帮忙,那就太好了


@阴沉的高拱门我会详细阐述一下。该代码适用于无法识别SSML标记的文本到语音应用程序。当用户为text-to-speech应用程序输入一条消息时,他们可以选择将一个单词括在
标记中,使说话者以首字母缩略词的形式说出世界。因为首字母缩略词SSML标记不起作用,所以我想在出现时删除标记,并在标记中包含的每个字符后面加逗号以将其伪造出来(例如:test变成t,e,s,t,)。字符串中所有未标记的单词后面不需要逗号,只需要那些包含在标记中的单词(如果需要,请参见我的第一个示例)。

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

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

假设您已经通过正则表达式解析了目标字符串,即在其周围没有标记

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);
        }
    }
}

解析XML非常困难,因为您可能需要处理诸如CDATA节、嵌套元素、实体、代理字符等等。我会使用基于状态的解析器,比如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);
    }
}
使用系统;
类replaceAntentswithcommaseparatedchars
{
静态只读字符串acroStartTag=“”;
静态只读字符串acroEndTag=“”;
静态void Main(字符串[]参数)
{
字符串s=“Alpha-Beta-Gamma-Delta”;
while(true)
{
int start=s.IndexOf(acroStartTag);
如果(开始<0)
打破
int end=s.IndexOf(acroEndTag,start+acroStartTag.Length);
如果(结束<0)
端部=s.长度;
字符串内容=s.Substring(start+acroStartTag.Length,end-start-acroStartTag.Length);
字符串[]chars=Array.ConvertAll(contents.tocharray(),c=>c.ToString());
s=s.子串(0,开始)
+string.Join(“,”字符)
+s.子字符串(结束+acroEndTag.长度);
}
控制台。写入线(s);
}
}

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

myNewString=myOtherString.replace(cchar(“/”),cchar(“,”)
尝试使用正则表达式修改XML标记是非常有问题的。如果你解释一下你想要完成什么,这可能会有帮助;“标记”是指XML元素的内容吗?“某些部分”是什么意思?这是否意味着您不想在“部分”后面插入逗号?你以后会对这些标签做些什么吗?@Dour High Arch查看我的更新以了解更多解释。你能再详细说明一下吗?对不起,我是C#的新手,还没有对RegEx做过很多工作。这是我用来剥离标记的代码,string tagless=Regex.Replace(srcString,@“”,string.Empty);抱歉@Tejs,忘了在第一条评论中标记你的名字。