Извлечение строки с помощью регулярных выражений - PullRequest
1 голос
/ 26 февраля 2020

как преобразовать строку в List [String], где она может содержать специальные символы в scala / java Ввод => [ "Stack", "Overflow", "flow"] выход => List("Stack","Overflow","flow")

Ответы [ 3 ]

3 голосов
/ 26 февраля 2020

Не ясно, хотите ли вы сохранить кавычки или нет.

val input = """[ "Stack", "Overflow", "flow" ]"""

"\"[^\"]*\"".r.findAllIn(input).toList
//res0: List[String] = List("Stack", "Overflow", "flow")

"\"([^\"]*)\"".r.findAllMatchIn(input).map(_.group(1)).toList
//res1: List[String] = List(Stack, Overflow, flow)
2 голосов
/ 26 февраля 2020

Используйте одну из существующих Json библиотек синтаксического анализа.

Вот пример с upickle:

import upickle.default._

val res = read[List[String]](""" [ "Stack", "Overflow", "flow"] """)
println(res) //List(Stack, Overflow, flow)

У каждого из решений Regexp / split есть свои проблемы (см. В скрипте ниже).

fiddle: https://scalafiddle.io/sf/sH8KPLG/4

----------------------------------------
FOR INPUT:  [ "Stack", "Overflow", "flow"] 
----------------------------------------
scalway : (ok) List(Stack, Overflow, flow)
Tim     : (ok) List(Stack, Overflow, flow)
jwvh_2  : (ok) List(Stack, Overflow, flow)
jwvh_1  : (!!) List("Stack", "Overflow", "flow")

----------------------------------------
FOR INPUT:  [ "Sta ck", "Overflow+", " flow"] 
----------------------------------------
scalway : (ok) List(Sta ck, Overflow+,  flow)
Tim     : (!!) List(Sta, ck, Overflow, flow)
jwvh_2  : (ok) List(Sta ck, Overflow+,  flow)
jwvh_1  : (!!) List("Sta ck", "Overflow+", " flow")

----------------------------------------
FOR INPUT:  [ "Stack", "Overf\"low", "flow"] 
----------------------------------------
scalway : (ok) List(Stack, Overf"low, flow)
Tim     : (!!) List(Stack, Overf, low, flow)
jwvh_2  : (!!) List(Stack, Overf\, , )
jwvh_1  : (!!) List("Stack", "Overf\", ", ")
1 голос
/ 26 февраля 2020

Вот простой вариант:

val input = """[ "Stack", "Overflow", "flow"]"""

val output = input.split("\\W+").filter(_.nonEmpty)

split разбивает строку на слова, разделенные несловесными символами.

filter удаляет все пустые строки в начале / конец результата.

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