正则表达式使用几个可重复的捕获组

时间:2010-07-06 19:15:54

标签: java regex

我需要将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,它将在一组空间之间抓取每个字段并将其放入捕获组?

2 个答案:

答案 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");