2016-04-06 69 views
-2

我拿出像 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

+0

不要逃避“\”括号'[]'和'ORS | '。 –

回答

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 

如果想在这里使用正则表达式,我创建子正则表达式乏表示你后不同的文本部分,使这个有点管理:

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 
相关问题