【问题标题】:Need help inserting commas after each character in specific part of string需要帮助在字符串特定部分的每个字符后插入逗号
【发布时间】:2011-08-18 04:56:30
【问题描述】:

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

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

(需要成为)

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

谁能帮我解决这个问题?我已经设法使用 RegEx 去除标签,但我无法弄清楚如何仅在标签中包含的字符之后插入逗号。如果有人可以提供帮助,那就太好了。

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

【问题讨论】:

  • myNewString = myOtherString.replace(cchar("/"),cchar(","))
  • 尝试使用正则表达式修改 XML 标签是很成问题的。如果您解释您要完成的工作可能会有所帮助; “标签”是指 XML 元素的内容吗? “某些部分”是什么意思?这是否意味着您不想在“部分”之后插入逗号?之后你会用这些标签做点什么吗?
  • @Dour High Arch 查看我的更新以获得更多解释。

标签: c# .net


【解决方案1】:

如果您已经弄清楚了正则表达式,我想捕获标签的内部文本会很简单。那么插入逗号是一个非常简单的操作:

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

【讨论】:

  • 您能详细说明一下吗?抱歉,我是 C# 新手,对 RegEx 并没有真正做很多工作。这是我剥离标签的代码,string tagless = Regex.Replace(srcString, @"", string.Empty);
  • 抱歉@Tejs,忘记在第一条评论中标注你的名字了。
【解决方案2】:

假设您已经通过 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);
        }
    }
}

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多