在Scala中选择两个字符之间的子字符串

Jac*_*ack 5 string scala

我从HTTP请求中得到一个乱码的JSON字符串,所以我正在寻找一个临时解决方案来仅选择JSON字符串.

request.params()返回:

[{"insured_initials":"Tt","insured_surname":"Test"}=, _=1329793147757,
callback=jQuery1707229194729661704_1329793018352
Run Code Online (Sandbox Code Playgroud)

我希望从"{"开始到"}"结束的所有内容.

我发现了很多与其他语言做类似事情的例子,但这样做的目的不仅是解决问题,还要学习Scala.有人请告诉我如何选择{....}部分吗?

Jen*_*der 5

Regexps应该做的伎俩:

"\\{.*\\}".r.findFirstIn("your json string here")
Run Code Online (Sandbox Code Playgroud)


Fra*_*ank 4

正如 Jens 所说,正则表达式通常就足够了。但是,语法有点不同:

"""\{.*\}""".r
Run Code Online (Sandbox Code Playgroud)

创建一个scala.util.matching.Regex对象,它提供了您可能想要对正则表达式执行的典型查询方法。

在您的情况下,您只对序列中的第一次出现感兴趣,这是通过以下方式完成的findFirstIn

scala> """\{.*\}""".r.findFirstIn("""[{"insured_initials":"Tt","insured_surname":"Test"}=, _=1329793147757,callback=jQuery1707229194729661704_1329793018352""")
res1: Option[String] = Some({"insured_initials":"Tt","insured_surname":"Test"})
Run Code Online (Sandbox Code Playgroud)

请注意,它返回Option类型,您可以在匹配中轻松使用该类型来查明是否成功找到正则表达式。

编辑:最后要注意的一点是,正则表达式通常不匹配换行符,因此,如果您的 JSON 未完全包含在第一行中,您可能需要首先考虑消除换行符。

  • 关于“消除换行符”的简短评论:更好地使用 (?s) 修饰符 - so 。也会匹配换行符。[关于正则表达式的参考](http://docs.oracle.com/javase/tutorial/essential/regex/pattern.html) (2认同)