Unescape все вложенные цитаты - PullRequest
0 голосов
/ 07 марта 2011

Я хочу удалить все вложенные кавычки в строке.Следующие примеры приведены в виде буквенных (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-последовательности.

Любые идеи приветствуются, спасибо!

1 Ответ

2 голосов
/ 07 марта 2011

Я не думаю, что это можно сделать, поскольку вопрос стоит сейчас, потому что синтаксис, который вы хотите обработать, неоднозначен. Например, невозможно определить, является ли:

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

Должен быть превращен в список с двумя элементами:

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

.. или список только с одним элементом (с текстом, содержащим несколько забавных символов):

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

Кажется, вы пытаетесь что-то сделать с выводом, напечатанным F # Interactive. Может быть, есть лучший способ напечатать то, что вам нужно, чтобы избежать двусмысленности. Не могли бы вы добавить большую картинку?

Если вам нужно обработать какую-либо структуру данных списка / кортежа, то, вероятно, будет проще написать ее с использованием F # отражающего API (см. Microsoft.FSharp.Reflection пространство имен), чем путем синтаксического анализа выходных данных F #. (Или вы можете использовать API, чтобы написать свой собственный однозначный принтер)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...