我需要将Radius消息中的一组非常统一的数据添加到我们的日志管理解决方案中。该产品提供了使用正则表达式语句以几种形式提取各种数据的能力。
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 Regex,它将在一组空间之间抓取每个字段并将其放入捕获组?
答案 0 :(得分:2)
你可以更具体:
(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s(\S*)\s
\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和我的解决方案是等效的,你的正则表达式大约慢十倍。
答案 1 :(得分:1)
我只是想到了别的东西 - 为什么不简单地将字符串拆分为空白?
String[] splitArray = subjectString.split("\\s");