Я хочу удалить все вложенные кавычки в строке.Следующие примеры приведены в виде буквенных (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 # в строки исходного кода 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"
, которые я хотел бы использовать как можно больше (чтобы я мог пройти и обработать конечный набор случаев, таких как списки, массивы, кортежи ии так далее, это не так широко, как хотелось бы): поэтому спринт a list<string*int>
Value
требует особой осторожности, например, так как нам нужно различать кавычки, которые должны отображаться буквально для построения строки,против тех, которые должны отображаться как escape-последовательности.
Любые идеи приветствуются, спасибо!