我正在努力处理正则表达式。 我喜欢匹配类似于下面示例的文本。
文本由块组成,始终以
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)
任何人都可以给我提示,我做错了什么以及如何实现这场比赛?
非常感谢
我假设您没有立即处理整个文件;您至少已经分割了字符串,使得每个
wlan
都是每个字符串的开头。否则,我们将不得不想出一个新的正则表达式。
尝试这个正则表达式:
(?s:wlan (.+?)(?=\n +dot1 authent (.+?)))
表示为 Perl 正则表达式:
/^wlan (.+?)(?=\n +dot1 authent (.+?))/s
这使用环视来确定字符串前面是否有缩进的
dot1 authent
行。
您可以使用负前瞻来防止交叉线,使其成为一个单独的块,并每个块至少匹配一次
dot1 authend
。
^wlan (\S+).*(?:\r?\n(?!wlan|.*? dot1 authent ).*)*\r?\n.*? dot1 authent (.+).*(?:\r?\n(?!wlan).*)*
查看 正则表达式演示