2011-03-06 55 views
0

我想隐藏字符串中的所有嵌套引号。下面的例子给出的文字(C#或F#)风格.NET字符串,而不是用双引号包围:Unescape所有嵌套的引号

  • [(\"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#语句转换为F#源代码字符串的项目。所以我有功能source: Expr -> string这应该产生一个字符串,当打印到一个典型的控制台,如FSI是有效的F#代码。对于这个问题,我期待改进Value报价表达式的跑步方式。目前,我像做以下(见起始线312 http://code.google.com/p/unquote/source/browse/trunk/Unquote/Sprint.fs真正的代码):

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需要特别小心,因为我们需要区分应该逐字显示的引号用于字符串构造,而不是那些应该显示为转义序列的字符串。

任何想法欢迎,谢谢!

+0

这是调试器的工件。反斜杠实际上并不存在于字符串中。使用ToCharArray()方法自己查看。或文本可视化。 – 2011-03-06 22:45:08

+0

Hi @Hans Passant - 我实际上并不是在查看调试器的输出,而是知道我给出的字面字符串产生的真正字符序列(我希望我不是很清楚,但我真的想要替换嵌套的引用带有反斜杠字符后跟引号字符的字符,但保留外引号对不变)。 – 2011-03-06 22:55:29

+0

@Stephen:这是什么语法?在这个语法中,“hello”world是否真的有效(它会给*“hello”world“*)? – 2011-03-06 23:18:25

回答

2

我不认为这可以做为目前的问题,因为你想要处理的语法是模棱两可的。例如,它是不可能告诉是否:

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

应该变成名单有两个元素:

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

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

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

看来你正在试图做的与F#互动打印输出的东西。也许有更好的方法来打印你需要的东西,这样你就可以避免模糊不清。你可以添加一些大图片吗?

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

+0

嗨@Tomas - 这是有道理的,我现在看到,既然开头和结尾之间的引号之间没有区别,语法是绝望的含糊不清的。我很乐意编辑我的问题,很快就会给出全局图片。 – 2011-03-07 03:02:15

+0

好吧 - 我用大图编辑了问题,谢谢 – 2011-03-07 03:44:04

+0

谢谢@Tomas - 如果我跟进了这个功能,我会接受你的建议并使用反射来实现一个自定义的通用打印机。 – 2011-04-20 15:37:12