2015-04-29 3 views
3

Я нашел много сообщений об экранирующей строке, но не об отмене экранирования.Как удалить строку в scala?

Использование Scala Play, мой контроллер принимает JSON в качестве запроса. Я извлечь строку из него с помощью:

val text: play.api.libs.json.JsValue = request.body.\("source") 

Если я печатаю text.toString я, например,

"Hello\tworld\nmy name is \"ABC\"" 

Как я могу преобразовать этот экранированный текст в обычный? Результат должен выглядеть

Hello world 
my name is "ABC" 

До этого момента, я попробовал такой подход, как это следующим образом:

replaceAll("""\\t""", "\t") 

Однако, создавая все возможные спасаясь правила могут быть слишком сложными. Поэтому мой вопрос: как это сделать? Возможно использование стандартной библиотеки. Возможны также Java-решения.

ответ

10

Есть interpolations, которые позволяют преобразовывать строки в отформатированные и/или экранированные последовательности. Эти интерполяции, такие как s"..." или f"...", обрабатываются в StringContext.

Он также предлагает функцию реверса:

val es = """Hello\tworld\nmy name is \"ABC\"""" 
val un = StringContext treatEscapes es 
+0

Пожалуйста, объясните нижний план. Этот метод предоставляет запрошенный результат. – Flown

+0

Я не спустил вниз вас, напротив, я отметил вас в качестве ответа и дал преимущество. Он работает точно так, как описано. Спасибо – petrbel

+2

Я действительно имел в виду downvoter, не оставляя никаких комментариев. Я рад, что смогу вам помочь. – Flown

2

Вы должны использовать метод unescape из стандартной библиотеки scala. Вот link к документации, которую вы найдете в прямом порядке в конце части «Ценность».

0

Это не ответ на неэкранированные строки в целом, но специально для обработки JsValue:

text match { 
    case JsString(value) => value 
    case _ => // what do you want to do for other cases? 
} 

Вы можете реализовать в этом экранирования в пути:

def unescapeJson(s: String) = JSON.parse('"' + s + '"') match { 
    case JsString(value) => value 
    case _ => ??? // can't happen 
} 

или использовать StringEscapeUtils из Apache Commons Ланг (хотя это довольно большая зависимость).

+0

это должно быть, вероятно, высказать свое мнение только, что угодно, хороший момент, спасибо :) – petrbel

+0

других ответы только иметь дело с Scala экранирующих последовательностей, которые не являются таким же, как JSON escape-последовательности ('\ /' действителен в JSON, но не в Scala, восьмеричные escape-образы наоборот). –

+0

@petrbel Я действительно добавил еще пару опций :) –

Смежные вопросы