我想隐藏字符串中的所有嵌套引号。下面的例子给出的文字(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
需要特别小心,因为我们需要区分应该逐字显示的引号用于字符串构造,而不是那些应该显示为转义序列的字符串。
任何想法欢迎,谢谢!
这是调试器的工件。反斜杠实际上并不存在于字符串中。使用ToCharArray()方法自己查看。或文本可视化。 – 2011-03-06 22:45:08
Hi @Hans Passant - 我实际上并不是在查看调试器的输出,而是知道我给出的字面字符串产生的真正字符序列(我希望我不是很清楚,但我真的想要替换嵌套的引用带有反斜杠字符后跟引号字符的字符,但保留外引号对不变)。 – 2011-03-06 22:55:29
@Stephen:这是什么语法?在这个语法中,“hello”world是否真的有效(它会给*“hello”world“*)? – 2011-03-06 23:18:25