复杂的 (PHP) 正则表达式,具有积极的后视能力
Posted
技术标签:
【中文标题】复杂的 (PHP) 正则表达式,具有积极的后视能力【英文标题】:Complex (PHP) regex with positive lookbehind 【发布时间】:2020-02-05 18:45:48 【问题描述】:我想匹配以下测试字符串(line 2 和 line 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 组:DNS
或 IP 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) 正则表达式,具有积极的后视能力的主要内容,如果未能解决你的问题,请参考以下文章
Javascript 正则表达式(负)后视在 Firefox 中不起作用