如何使用正则表达式拆分scala字符串

时间:2016-04-06 04:05:26

标签: scala

我提出了一个类似的模式 val pattern = "(\\w+)\\|(.*)\\|\\[(.*)\\]\\|\"(.*)\"\\|\"(.*)\"\\|\\[(.*)\\]\\|\\[(.*)\\]\\|(.*)\\|\\[(.*)\\]\\|\\[(.*)\\]".r

我有一个原始字符串

var str = """AuthLogout|vmlxapp21a|[13/Jan/2016:16:33:15 +0100]|"66.77.444.44 uid=XXXXX,ou=People,o=Bank,o=External,dc=xxxx,dc=com"|"abcd_123_portalweb_w  "|[]|[41]||[]|[]"""

然后将模式应用于字符串,但它始终为空。

val items = pattern.findAllIn(str).toList

1 个答案:

答案 0 :(得分:2)

如果我理解你正在尝试做什么,也许使用巨大的正则表达式并不是最简单的方法:你可以split通过|并摆脱不需要的分隔符([]")使用replaceAll

val str = """AuthLogout|vmlxapp21a|[13/Jan/2016:16:33:15 +0100]|"66.77.444.44 uid=XXXXX,ou=People,o=Bank,o=External,dc=xxxx,dc=com"|"abcd_123_portalweb_w  "|[]|[41]||[]|[]"""
val withoutBoundaries = str.replaceAll("[\"\\]\\[]","")
val result = withoutBoundaries.split("\\|")
result.foreach(println)

打印哪些:

AuthLogout
vmlxapp21a
13/Jan/2016:16:33:15 +0100
66.77.444.44 uid=XXXXX,ou=People,o=Bank,o=External,dc=xxxx,dc=com
abcd_123_portalweb_w  

41

如果您 想在这里使用正则表达式,我会创建表示您之后不同文本部分的子正则表达式变量,以使其具有一定的可管理性: / p>

val plain = "(.*)"              // no boundary characters
val boxed = s"\\[$plain\\]"     // same, encapsulated by square brackets
val quoted = '"' + plain + '"'  // same, encapsulated by double quotes

// the whole thing, separated by pipes:
val r = s"$plain\\|$plain\\|$boxed\\|$quoted\\|$quoted\\|$boxed\\|$boxed\\|$plain\\|$boxed\\|$boxed".r

val result = r.findAllIn(str).toList // this list has one item, as expected.

现在,如果你想看看这个正则表达式是什么样的,这里是 - 但我不建议在你的代码中使用它...:

val r = """(.*)\|(.*)\|\[(.*)\]\|"(.*)"\|"(.*)"\|\[(.*)\]\|\[(.*)\]\|(.*)\|\[(.*)\]\|\[(.*)\]""".r