Unescape所有嵌套引号

时间:2011-03-06 22:40:10

标签: .net regex string f# escaping

我想在字符串中取消所有嵌套引号。以下示例以文字(C#或F#)样式的.NET字符串形式给出,不用引号括起来:

  • [(\"hello world\", 2); (\"goodbye\", 3)]不会改变
  • [(\"hello\"world\", 2); (\"go\"o\"d\"bye\", 3)]变为[(\"hello\\\"world\", 2); (\"go\\\"o\\\"d\\\"bye\", 3)]

我不确定这是否可以用Regex(pattern, "\\\"").Replace来完成,但我仍然是一个正则表达式新手,因为解决方案很容易找到我。任何解决方案,如果可能的正则表达式,将不胜感激。

修改

感谢大家的反馈,我现在看到,由于开始和结束引号之间没有区别,语法含糊不清,我的方向无法奏效。因此,我将全力以赴,希望有一个新的方向。

我正在开发一个将F#Quotations转换为F#源代码字符串的项目。所以我有一个函数source: Expr -> string,它应该产生一个字符串,当打印到像FSI这样的典型控制台时,它是有效的F#代码。对于这个问题,我希望改进Value引用表达式的方式。目前我执行以下操作(请参阅http://code.google.com/p/unquote/source/browse/trunk/Unquote/Sprint.fs的第312行开始获取实际代码):

match expr with
| Value(o, _) ->
  match o with
  | null -> "null"
  | _ -> sprintf "%A" o

但是,例如,我得到以下内容

> <@ "\r\"\n" @> |> source |> stdout.WriteLine;;
"
"
"
val it : unit = ()

而不是所需的

> <@ "\r\"\n" @> |> source |> stdout.WriteLine;;
"\r\"\n"
val it : unit = ()

如果我只需要考虑Values封装字符串,那就像

那样容易
let unescape s =
    ["\\","\\\\"
     "\b","\\b"
     "\n","\\n" 
     "\r","\\r" 
     "\t","\\t"
     "\"", "\\\""]
    |> List.fold (fun (s:string) (before, after) -> s.Replace(before, after)) s

问题是,任何对象都可能是Value,包括sprint "%A"使用的结构化格式的对象,我希望尽可能地利用它们(所以我可以通过并处理一组有限的案例,如列表,数组,元组等,这些不像我希望的那样通用):所以短跑list<string*int> Value需要特别小心,例如因为我们需要区分字面意义上应该用于字符串构造的引号和应该显示为转义序列的引号。

欢迎任何想法,谢谢!

1 个答案:

答案 0 :(得分:2)

我不认为这可以在目前的问题上完成,因为你想要处理的语法是模糊的。例如,无法判断是否:

  

[ (\"hello\"world\", 2); (\"good\"bye\", 3)]

应该变成带有两个元素的列表:

  

[ (\"hello\\\"world\", 2); (\"good\\\"bye\", 3)]

..或只包含单个元素的列表(包含一些时髦符号的文本):

  

[ (\"hello\\\"world\\\", 2); (\\\"good\\\"bye\", 3)]

您似乎正在尝试使用F#Interactive打印的输出。也许有更好的方法来打印你需要的东西,这样你就可以避免歧义。你能加点大概吗?

如果您需要处理任何列表/元组数据结构,那么使用F#reflection API(参见Microsoft.FSharp.Reflection命名空间)而不是解析F#输出可能更容易。 (或者您可以使用API​​编写自己的明确打印机)