pcre_regex 条件模式,"or" 和 "and" 条件

pcre_regex with conditional patterns, "or" and "and" conditions

我正在使用 pcre-regex-engine 来匹配我的 file/line 中的模式。试图找到匹配项的行是:

line-001 key_one:10.20.30.40 any data goes here
line-002 key_two:11.22.33.44 any data goes here
line-003 key_off:12.32.42.52 any data goes here
line-004 key_ten:34.45.67.89 any data goes here

现在,我想匹配以 key_one:key_two:key_ten: 开头的 ip 模式。我需要我的模式是有条件的,“匹配以 key_one:key_two:key_ten:.

开头的任何 ip 模式

预期模式= key_one | key_two| key_ten & (\d+.\d+.\d+.\d+)

但是,or(|) 条件适用于 pcre,但 and(&) 条件无效。有人可以帮助我使用 and (&) 条件吗?谢谢你

你的正则表达式几乎是正确的:你没有考虑到模式中的空格是有意义的(在 PCRE 中,在字符 类 之外),除非使用 /x 修饰符,并且有值之间的冒号。此外,必须对点进行转义以匹配文字点。

您可以使用

(key_(?:one|two|ten)):(\d{1,3}(?:\.\d{1,3}){3})

这是

的缩略形式
(key_one|key_two|key_ten):(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

the regex demo

如果需要获取IP作为匹配值,使用\K运算符丢弃匹配到该运算符的所有文本,return仅丢弃后面匹配的内容:

key_(?:one|two|ten):\K\d{1,3}(?:\.\d{1,3}){3}

参见 this regex demo

请注意,最佳做法是以 none 可以在同一位置匹配的方式编写备选方案(以提高性能),这就是为什么重复不是一个好主意(...|...).

中相同的 key_ 子串

+ 量词匹配 1 次或多次出现,并且在 IP 地址中只能有一到三位数字,这就是为什么限制量词 {1,3} 似乎更可靠。

此外,为了避免不必要的捕获,只需将捕获 ((...))组转换为non-capturing组((?:...)).