gpt4 book ai didi

java - 使用多个可重复捕获组的正则表达式

转载 作者:行者123 更新时间:2023-12-04 06:50:31 25 4
gpt4 key购买 nike

我有一组非常统一的来自 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 将抓取一组空格之间的每个字段并将其放入捕获组中是什么?

最佳答案

你可以更具体:

(\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 步内失败(比初始正则表达式快近一百倍)。

如果匹配成功,Alan 和我的解决方案是等效的,您的正则表达式大约慢十倍。

关于java - 使用多个可重复捕获组的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3189453/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com