使用多个可重复捕获组的java正则表达式
我有一组来自Radius消息的非常统一的数据,需要添加到日志管理解决方案中。该产品提供了使用regex语句以几种形式提取各种数据的能力
1)要提取的每段数据的单个正则表达式
<data 1 = regex statement>
<data 2 = different regex statement>
<data 2 = yet another regex statement>
2)使用捕获群的奇异正则表达式
<group = regex statement with capture groups>
<data 1 = capture group[X]
<data 2 = capture group[Y]
<data 3 = capture group[Z]
</group>
<158>Jul 6 14:33:00 radius/10.10.100.12 radius: 07/06/2010 14:33:00 AP1A-BLAH (10.10.10.10) - 6191 / Wireless - IEEE 802.11: abc1234 - Access-Accept (AP: 000102030405 / SSID: bork / Client: 050403020100)
我想提取一些数据,它们都在空格之间。以下几点似乎并不有效:
(.*?)\s(.*?)\s(.*?)\s(.*?)\s(.*?)\s(.*?)\s
那么,考虑到上面的数据,最有效的Java正则表达式是什么,它将捕获一组空格之间的每个字段并将其放入捕获组
# 1 楼答案
我只是想了些别的事情——为什么不简单地在空白处拆分字符串呢
# 2 楼答案
你可以说得更具体一些:
\S
匹配非空格字符-这通过避免回溯使正则表达式更有效,并且如果输入不符合模式,它允许正则表达式更快地失败也就是说,当将正则表达式应用于字符串
Jul 6 14:33:00 radius/10.10.100.12 radius: 07/06/2010
时,需要正则表达式引擎2116步才能发现它不匹配。上面的正则表达式在168个步骤中失败Alan Moore关于使用
(\S*+)\s(\S*+)\s(\S*+)\s(\S*+)\s(\S*+)\s(\S*+)\s
的建议带来了另一个改进——现在正则表达式在24个步骤内失败(比初始正则表达式快近100倍)如果匹配成功,Alan和我的解决方案是等效的,你的正则表达式大约慢十倍