我有以下代码行:
string str = "\"\\trandom string\\n\"";
现在我需要一个方法来获取:
string result = "\trandom string\n";
就像编译器如何处理带引号的字符串一样
请注意,字符串str
是随机的,这意味着任何字符(包括'\t'
,'\n'
,'\"'
等都可能出现在结果中。
我的问题是: 我可以使用C#中现有的方法吗?如果没有,你有什么建议吗?
编辑:
我想要的是:
"\\t"
- > '\t'
"\\n"
- > '\n'
"\\\\"
- > '\\'
等任何在引号内不是字面的东西
答案 0 :(得分:0)
简单状态机的完美时间。
编辑:为转义字符添加了第三个状态,这个状态机假定你只关心引号中的转义字符,对于在任何地方处理转义字符的情况,它会有更多的状态,但我认为这给了一个足够好的构建块。
//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;
答案 1 :(得分:0)
System.Text.RegularExpressions.Regex.Unescape