有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

使用多个可重复捕获组的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正则表达式是什么,它将捕获一组空格之间的每个字段并将其放入捕获组


共 (2) 个答案

  1. # 1 楼答案

    我只是想了些别的事情——为什么不简单地在空白处拆分字符串呢

    String[] splitArray = subjectString.split("\\s");
    
  2. # 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和我的解决方案是等效的,你的正则表达式大约慢十倍