复杂的 (PHP) 正则表达式,具有积极的后视能力

Posted

技术标签:

【中文标题】复杂的 (PHP) 正则表达式,具有积极的后视能力【英文标题】:Complex (PHP) regex with positive lookbehind 【发布时间】:2020-02-05 18:45:48 【问题描述】:

我想匹配以下测试字符串(line 2line 3),其中 line 3 将是随机顺序并且 第 2 行 将是一个常数。

    X509v3 extensions:
        X509v3 Subject Alternative Name:
            IP Address:55.66.77.88, DNS:example.com, DNS:www.example.com, IP Address:44.33.22.11
Signature Algorithm: sha384WithRSAEncryption

我可以使用以下正则表达式在第 3 行获得匹配:

\s+(?|(DNS):([\w\.\d]+),|(IP Address):([\d\.]+))

但是,当我添加一个积极的后视时,如下所示,我不再得到完整的匹配。 任何帮助将不胜感激。

(?<=X509v3 Subject Alternative Name:\s)\s+(?|(DNS):([\w\.\d]+),|(IP Address):([\d\.]+))

【问题讨论】:

【参考方案1】:

由于您正在提取,您可以将您的模式大大简化为(DNS|IP Address):([\w.]+),其中IP 地址与[\w.]+ 匹配,与DNS 相同,因为\w 也匹配数字。然后,要定义自定义边界,您可以使用基于 \G 的模式,例如

(?:\G(?!\A),\s*|X509v3 Subject Alternative Name:\s+)(DNS|IP Address):([\w.]+)

见regex demo

详情

(?:\G(?!\A),\s*|X509v3 Subject Alternative Name:\s+) - 两种选择之一: \G(?!\A),\s* - 上一个成功匹配的结束 (\G(?!\A)),然后是逗号和 0+ 个空格 | - 或 X509v3 Subject Alternative Name:\s+ - X509v3 Subject Alternative Name: 子字符串,然后是 1+ 个空格 (DNS|IP Address) - 第 1 组:DNSIP Address : - 冒号 ([\w.]+) - 第 2 组:一个或多个单词(字母、数字或 _)或点字符。

【讨论】:

这令人印象深刻。谢谢!【参考方案2】:

当我们添加正向后视时,只有下一行中的第一个条目会匹配,因为对于其余的 IP 地址或 DNS 名称,正向后向并不是真的就在它们之前。文本 X509v3 Subject Alternative Name: 仅位于第一个 IP 地址或 DNS 名称之前。

这是后视模式(模式 1)

(?<=X509v3 Subject Alternative Name:)\s+(DNS:([\w\.\d]+),|IP Address:([\d\.]+))

这是 IP 地址或 DNS 名称模式(模式 2)

\s+(DNS:([\w\.\d]+),|IP Address:([\d\.]+))

因此,我认为你必须这样做:

    首先检查文本是否与模式 1 匹配。这将确保您选择了所需的行或条目。 接下来,应用模式 2 并选择值。

我在 Java 上对其进行了测试,发现它可以正常工作。由于您在标题中提到了 php,我认为该代码可能对您没有用处。因此,不发布。

【讨论】:

以上是关于复杂的 (PHP) 正则表达式,具有积极的后视能力的主要内容,如果未能解决你的问题,请参考以下文章

基于 PHP 的数据爬取(QueryList)

Javascript 正则表达式(负)后视在 Firefox 中不起作用

Java 正则表达式的后视组在附近没有明显的最大长度

查找连续重复单词时的Python后视正则表达式“固定宽度模式”错误

正则表达式替换文本,除非它前面有反斜杠而不使用后视

PHP中复杂的正则表达式