Регулярное выражение для удаления \" из Groovy GString?

Я пытаюсь проанализировать JSON с помощью Grails, чтобы протестировать синтаксический анализатор. Я написал модульный тест и поместил свой ввод JSON в GString, который выглядит примерно так:

"""{"Information":"Some data here \"stuff\" some more.","AnswerToEverything":42,"Other":71,"Name":"Joe Doe"}"""

"Материал" вызывает поломку синтаксического анализатора.

Я попытался использовать String.replace(/\\"/, "") и несколько других комбинаций для удаления \", но это либо ничего не делает, либо удаляет все кавычки из строки. Это сообщение говорит мне, что мне нужно использовать 5 косых черт: \\\\\", чтобы заставить его работать в Java, но это не работает в Отличный.

Изменить: этот тест должен пройти, чтобы он работал:

str = """foo \"foobar\" bar"""
assert  str.replace("""\\\"""", "")  == "foo foobar bar"

С приведенным выше регулярным выражением это не удается.

Какие-нибудь советы?


person Cleber Goncalves    schedule 15.10.2010    source источник
comment
Пост, на который вы ссылаетесь, на самом деле указывает на то, что вам нужно всего 5 косых черт: вам нужно четыре обратных косых черты, чтобы получить одну на выходе, и еще одну, чтобы избежать двойной кавычки   -  person eldarerathis    schedule 15.10.2010
comment
5 косых черт тоже не работают (или что-то от 1 до 6, проверено, чтобы убедиться). Исправил ошибку, спасибо.   -  person Cleber Goncalves    schedule 15.10.2010


Ответы (1)


Из того, что я могу сказать, регулярные выражения, написанные с as /regexp/, похоже, имеют проблемы с экранированными обратными косыми чертами. Вы можете написать регулярное выражение с конструкцией """ следующим образом:

str = "\\\""
assert str[0] == "\\"
assert str[1] == "\""

assert str =~ """\\\""""
assert str.replace("""\\\"""", "") == ""

РЕДАКТИРОВАТЬ: JSON в исходном сообщении не содержит буквальной обратной косой черты. Вам все еще нужно избегать буквальных обратных косых черт даже в """strings""". Я предполагаю, что вы хотите избежать их, как в json2 ниже:

json1 = """{"Information":"Some data here \"stuff\" some more.","AnswerToEverything":42,"Other":71,"Name":"Joe Doe"}"""
json2 = """{"Information":"Some data here \\"stuff\\" some more.","AnswerToEverything":42,"Other":71,"Name":"Joe Doe"}"""
assert !json1.contains("\\")
assert json2.contains("\\")
assert json2.replace("""\\\"""", "replacement").contains("replacement")
person ataylor    schedule 15.10.2010
comment
Не сработало, я использовал ваш код для создания простого теста, код находится в исходном вопросе (форматирование не работает с комментариями). - person Cleber Goncalves; 16.10.2010
comment
Спасибо за ввод, я на самом деле не контролирую содержимое входного JSON, строка, которую я получаю, похожа на ваш пример «json1», я пытаюсь удалить \, чтобы синтаксический анализатор JSON работал. Чтобы избежать косых черт ( \\ ), мне пришлось бы отредактировать ввод вручную, чего я не могу, или найти способ обнаружить \ в регулярном выражении, чтобы я мог заменить его на \\ или просто удалить. - person Cleber Goncalves; 16.10.2010