如何编写Scala正则表达式来捕获两个双引号之间的所有引用内容(包括转义的引号)?

时间:2018-04-26 18:23:42

标签: regex scala pattern-matching

如何编写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

" \吨\ n" => \吨\ n

" \\" => \\

" \" =>这是错误的(所以它永远不会发生),因为第二个引号被转义,因此双引号没有配对

" ABC \" => ABC \"

"你好\\"世界\"" =>这也是错误的(所以它永远不会发生)因为\被转义并且引号没有被正确转义

"你好\\\"世界\\\"" =>你好\\\"世界\\\"

转义的字符可以是: \" \\ \ n \ t \ b \ r \ f \ / 否则它只是简单的文本。

编辑:

我的字符串是JSON样式,如:

" abc":"价值" 或" abc \ t \ n \" def":"价值"

我的目标是在冒号前提取abc或abc \ t \ n \" def。

总结一下:

我的目标是找到第一个(未转义的)引号(它是字符串的一部分),找到配对的(未转义的)引号(也是字符串的一部分),然后在它们之间提取所有内容。

2 个答案:

答案 0 :(得分:1)

尝试

"((?:[^"\\]|\\[\\"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

答案 1 :(得分:0)

我只是用

&#34;&#34;&#34;([^&#34; \] | \&#34; | \ T | \ n | \ C | \ r | \ / | \ F)* &#34;&#34;&#34; .R

似乎在起作用。

谢谢。