单行正则表达式问题

问题描述 投票:0回答:2

我正在努力处理正则表达式。 我喜欢匹配类似于下面示例的文本。

文本由块组成,始终以

wlan
开头。 仅当块中存在
dot1 authent
行时,正则表达式才应匹配。

SSIDx
后面的
wlan
应与第一个正则表达式组匹配。
dot1 authent
后面的单词应该在第二个正则表达式组中匹配。

第 1 组 第2组 结果
SSID1 测试测试1 好的
SSID3 测试测试3 好的
SSID4 测试测试4 好的
wlan SSID1 SSID1
 test2
 test1
 dot1 authent TESTTEST1
 test3
wlan SSID2 SSID2
 test21
 test11
 test31
wlan SSID3 SSID3
 test22
 test12
 dot1 authent TESTTEST3
 test32
wlan SSID4 SSID4
 test23
 test13
 dot1 authent TESTTEST4
 test33

以下 RegEx 表达式确实匹配几乎所需的内容。

(?s:wlan (.+?)\s.+?dot1 authent (.+?)\n)

不幸的是,如果 wlan 组不包含行

dot1 authent
,正则表达式会匹配以下 wlan 组,从而导致错误匹配。

在示例中,匹配如下:

组1 第2组 结果
SSID1 测试测试1 好的
SSID2 测试测试3 不行
SSID4 测试测试4 好的

SSID2
不应匹配,因为未为此组定义
dot1 authent
。 相反,它应该匹配
SSID3

我在正则表达式中添加了

(?!wlan)
,但这没有任何效果。

(?s:wlan (.+?)\s.+?(?!wlan)dot1 authent (.+?)\n)

任何人都可以给我提示,我做错了什么以及如何实现这场比赛?

非常感谢

regex regex-lookarounds
2个回答
0
投票

我假设您没有立即处理整个文件;您至少已经分割了字符串,使得每个

wlan
都是每个字符串的开头。否则,我们将不得不想出一个新的正则表达式。

尝试这个正则表达式:

(?s:wlan (.+?)(?=\n +dot1 authent (.+?)))

表示为 Perl 正则表达式:

/^wlan (.+?)(?=\n +dot1 authent (.+?))/s

这使用环视来确定字符串前面是否有缩进的

dot1 authent
行。


0
投票

您可以使用负前瞻来防止交叉线,使其成为一个单独的块,并每个块至少匹配一次

 dot1 authend

^wlan (\S+).*(?:\r?\n(?!wlan|.*? dot1 authent ).*)*\r?\n.*? dot1 authent (.+).*(?:\r?\n(?!wlan).*)*

查看 正则表达式演示

© www.soinside.com 2019 - 2024. All rights reserved.