我从Salesforce查询中得到了一个格式不好的字符串,它应该是CSV,并带有我选择的字符串,但是API调用没有为行或行项目提供很多健康的分隔符。唯一的行选择是LF或CRLF。但是,我知道第一列是一个数字(8位数),每行也以"
结束/开始。
因此,我正在寻找一种方法来分割行与double_quote,CR,LF,double_quote,8位数,同时保持8位数。(我可以失去引号。)
举例来说:
val lineSep = Seq('"', '\r','\n', '"').mkString
// desired lines returned
val a = Array(
"\"09994931\"`\"abc\"\r\n\"def\"", // desired line with end quote gone
"\"09994932\"`\"lmn\"\r\n\"poq\"", // desired line with first / end quote gone
"\"09994933\"`\"uvw\"\r\n\"xyz\"" // desired line with first quote gone
)
val blob = a.mkString("\r\n")
blob.split(lineSep).foreach(x => println("**"+x+"**"))
字符串
返回6行而不是3行:
**"09994931"`"abc**
**def**
**09994932"`"lmn**
**poq**
**09994933"`"uvw**
**xyz"**
型
因为我稍后会在"
"`上拆分行.所以我可以在行的末尾缺少一个引号,并在第一行的开头和最后一行的结尾处多加一个引号。
我知道有一些lookahead / behind选项,但我还没有确定一种方法来适应那些表示8位数的方法。
我认为这样的代码将是一个起点,但它不太正确-因为它不工作,我不确定是否要向前看或向后看,并占8位数了。
blob.split("""((?=\"\r\n\"d{0,9}>)|(?<=\"\r\n\"\d{0,9}>))""")
型
注意:为了避免混淆,我的大多数,有一个标题,我不提供,不应该问题,如果数字包括在内。
1条答案
按热度按时间qlckcl4x1#
与其将换行符也放入Assert,您可以创建一个没有交替的模式,在匹配一个换行符时进行分割,然后使用一个正向前瞻Assert
(?=
来Assert双引号之间的8位数。请注意,模式中的
>
字符不应该存在,d
也应该是\d
如果你把字符串放在三重引号之间,你不必转义
\"
,你也可以使用\R
来代替\r\n
字符串
输出
型
参见Scala demo和regex demo。