我在scala字符串拆分上遇到了一个奇怪的问题
这是我的代码:
scala> val s1 = "oauth_token=FOO&oauth_token_secret=BAR&oauth_expires_in=3600"
s1: String = oauth_token=FOO&oauth_token_secret=BAR&oauth_expires_in=3600
scala> s1.split("&")
res3: Array[String] = Array(oauth_token=FOO, oauth_token_secret=BAR, oauth_expires_in=3600)
到目前为止,split
方法效果很好,但是..
scala> val s2 = "oauth_token=FOO|oauth_token_secret=BAR|oauth_expires_in=3600"
s2: String = oauth_token=FOO|oauth_token_secret=BAR|oauth_expires_in=3600
scala> s2.split("|")
res4: Array[String] = Array("", o, a, u, t, h, _, t, o, k, e, n, =, F, O, O, |, o, a, u, t, h, _, t, o, k, e, n, _, s, e, c, r, e, t, =, B, A, R, |, o, a, u, t, h, _, e, x, p, i, r, e, s, _, i, n, =, 3, 6, 0, 0)
该方法实际上会拆分每个字符,即使奇怪的是,前面会出现一个空字符串。
我尝试了其他分隔符,例如%
,,
,该方法仍然有效。当split
用作分隔符时,|
似乎无法正常工作?
答案 0 :(得分:10)
split()
需要一个正则表达式,而regex-land |
表示" OR",所以你要拆分空字符串或空字符串,这是你所看到的。
您可以使用转义分割文字|
:
scala> val s2 = "oauth_token=FOO|oauth_token_secret=BAR|oauth_expires_in=3600"
s2: String = oauth_token=FOO|oauth_token_secret=BAR|oauth_expires_in=3600
scala> s2.split("\\|")
res0: Array[String] = Array(oauth_token=FOO, oauth_token_secret=BAR, oauth_expires_in=3600)
答案 1 :(得分:5)
Scala有一个隐式转换,它在接受split()
的字符串上提供char
方法:
scala> val s2 = "oauth_token=FOO|oauth_token_secret=BAR|oauth_expires_in=3600"
s2: String = oauth_token=FOO|oauth_token_secret=BAR|oauth_expires_in=3600
scala> s2.split('|')
res0: Array[String] = Array(oauth_token=FOO, oauth_token_secret=BAR, oauth_expires_in=3600)
当然,这仅适用于分割器是单个字符的情况。如果它是一个多字符字符串,您需要自己跟踪正则表达式特定的字符。