Как написать регулярное выражение Scala для захвата всего цитируемого содержимого между двумя двойными кавычками (включая экранированные кавычки)? - PullRequest
0 голосов
/ 26 апреля 2018

Как написать регулярное выражение Scala для захвата всего цитируемого содержимого между двумя двойными кавычками (включая экранированные кавычки)?

Моя цель - найти первую (неэкранированную) кавычку (которая является частью строки), найти парную (неэкранированную) кавычку (которая также является частью строки), а затем извлечь все между ними.

Я ожидаю что-то вроде этого:

"""??""".r findFirstMatchIn(""""abcdef\"abc"""") // Note that the real string begins from the fourth quotation marks, i.e. the real string is "abcdef\"abc"
res = Some(abcdef\"abc)

"""??""".r findFirstMatchIn(""""abcdef\"abc\t\t"""")
res = Some(abcdef\"abc\t\t)

"""??""".r findFirstMatchIn(""""abcdef\"abc\t\"\t"""")
res = Some(abcdef\"abc\t\"\t)

Я пробовал что-то вроде """([^\"])*([\\\\]+[\"tnbr/])+([^\"]*)*""".r, но это не работает для строки "abcdef\"abc\t\"\t"

Любые советы приветствуются.

редактирование:

Мое намерение состоит в том, чтобы извлечь каждый символ между парными двойными кавычками:

"abc" => abc

"abc \ n" => abc \ n

"\ t \ n" => \ t \ n

"\\" => \\

"\" => Это неправильно (так никогда не произойдет), потому что вторая кавычка экранирована, следовательно, двойные кавычки не спарены

"abc \" => abc \ "

"hello \\" world \ "" => Это также неправильно (так никогда не произойдет), потому что \ экранируется, а кавычка не экранируется должным образом

"hello \\\" world \\\ "" => hello \\\ "world \\\"

Спасшийся символ может быть: \ "\\ \ n \ t \ b \ r \ f \ / в противном случае это просто текст.

редактирование:

моя строка в стиле JSON, например:

"abc": "значение" или "abc \ t \ n \" def ":" значение "

и моя цель - извлечь abc или abc \ t \ n \ "def перед двоеточием.

Подведем итог:

моя цель - найти первую (неэкранированную) кавычку (которая является частью строки), найти парную (неэкранированную) кавычку (которая также является частью строки), а затем извлечь все между ними.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Попробуйте

"((?:[^"\\]|\\[\\"ntbrf])+)"

Демо: regex101

В коде Scala:

val regex = """"((?:[^"\\]|\\[\\"ntbrf])+)"""".r
val examples = List(
  """"abc"""",
  """"abc\n"""",
  """"\t\n"""",
  """"\\"""",
  """"abc\""""",
  """"hello\\\"world\""""",
  """"hello\\\"world\\\""""",
  """"abc": """,
  """"value" """,
  """or "abc\t\n\"def"""",
  """: "value"""",
  """abc"def\"abc"""",
  """abc"def\"abc\t\t"""",
  """abc"def\"abc\t\"\t""""
)

for (e <- examples) {
  println(regex.findFirstMatchIn(e).get.group(1))
}

Выход:

abc
abc\n
\t\n
\\
abc\"
hello\\\"world\"
hello\\\"world\\\"
abc
value
abc\t\n\"def
value
def\"abc
def\"abc\t\t
def\"abc\t\"\t
0 голосов
/ 26 апреля 2018

Я просто использую

"" "([^" \] | \ "| \ т | \ п | \ Ъ | \ г | \ / | \ е) *". "" Г

и похоже, что работает.

Спасибо.

...