Regex за премахване на \" от Groovy GString?

Опитвам се да анализирам JSON с помощта на Grails, за да тествам анализатора. Написах единичен тест и поставих моя въведен JSON в GString, който изглежда нещо подобно:

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

\"Нещата\" причиняват повреда на анализатора.

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

Редактиране: Този тест трябва да премине, за да работи:

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)


От това, което мога да кажа, регулярните изрази, написани с /regexp/, изглежда имат проблеми с екранирани обратни наклонени черти. Можете да напишете 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