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

如何使用正则表达式拆分scala字符串,scala,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=E

我想出了一个这样的模式
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

如果我理解你想做什么,也许使用一个巨大的正则表达式不是最简单的方法:你可以
通过
拆分
,并使用
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
如果您确实想在这里使用正则表达式,我将创建表示您所追求的不同文本部分的子正则表达式变量,以使其更易于管理:

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

不要转义“\”括号
[]
和OR