如何编写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。
总结一下:
我的目标是找到第一个(未转义的)引号(它是字符串的一部分),找到配对的(未转义的)引号(也是字符串的一部分),然后在它们之间提取所有内容。
答案 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
似乎在起作用。
谢谢。