【问题标题】:How to parse a quoted string如何解析带引号的字符串
【发布时间】:2014-01-29 14:34:23
【问题描述】:

我有以下代码行: string str = "\"\\trandom string\\n\"";

现在我需要一种方法来获取: string result = "\trandom string\n";

就像编译器处理带引号的字符串一样。
注意字符串str是随机的,这意味着任何字符,包括'\t''\n''\"'等都可能出现在结果中。

我的问题是: 我可以使用 C# 中的现有方法吗?如果没有,您有什么建议吗?

编辑:
我想要的是:
"\\t" -> '\t'
"\\n" -> '\n'
"\\\\" -> '\\'
等等任何不是引号内的文字

【问题讨论】:

  • 你到底想达到什么目的?
  • @rae1 我需要为我的程序编写脚本
  • 那么问题是如何将字符串的实例转换为其转义表示?
  • 我真的不明白。假设您的输入字符串是"a\\tb",您希望输出字符串是什么样的? a    b?
  • @StevenLiekens 还是相反?他想将\\t 转义为\t 吗? @MichaelKim 可能会扩展您的问题以提供更大图景的详细信息,这将有助于我们了解您想要实现的目标。

标签: c# string


【解决方案1】:

简单状态机的最佳时机。

编辑:为转义字符添加了第三种状态,此状态机假定您只关心引号内的转义字符,因为它可以在任何地方处理转义字符,它将有更多状态,但我认为这提供了一个足够好的构建块。

//define somewhere in your class
enum states { NOT_IN_QUOTES, IN_QUOTES, ESCAPE_CHAR }

//inside a function
states state = states.NOT_IN_QUOTES;
string result = "";
foreach(char c in str)
{
    switch(state)
    {
         case states.NOT_IN_QUOTES:
             if (c == '\"')
             {
                 state = states.IN_QUOTES;
             }
         break;
         case states.IN_QUOTES:
             if (c == '\"')
             {
                 state = states.NOT_IN_QUOTES;
             }
             else if (c == '\\')
             {
                 state = states.ESCAPE_CHAR;
             }
             else
             {
                  result += c;
             }
         break;
         case states.ESCAPE_CHAR:
             state = states.IN_QUOTES;
             result += c;
         break;
     }
}
return result;

【讨论】:

  • 这个只能处理引号。我需要处理诸如“\\n”之类的东西,引号内不是文字的东西
【解决方案2】:
System.Text.RegularExpressions.Regex.Unescape

【讨论】:

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