【问题标题】:pcre_regex with conditional patterns, "or" and "and" conditions带有条件模式、“或”和“与”条件的 pcre_regex
【发布时间】:2017-01-13 17:40:07
【问题描述】:

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

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 (&) 条件吗?谢谢你。

【问题讨论】:

  • 你尝试过的实际模式是什么?
  • @WiktorStribiżew 感谢您的重播。我试过这个:((key_one | key_two| key_ten) (\d+.\d+.\d+.\d+)),但它给了我这样的输出:key_one:10.20.30.40,key_two:11.22.33.44,但我想要仅 IP 字符串。

标签: regex pcre


【解决方案1】:

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

你可以使用

(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操作符丢弃所有匹配到该操作符的文本,只返回后面匹配的内容:

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

this regex demo

请注意,最佳做法是编写备选方案,使它们都不能在同一位置匹配(以提高性能),这就是为什么重复相同的 key_ 子字符串不是一个好主意在(...|...)内。

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

另外,为避免不必要的捕获,只需将捕获 ((...)) 组转换为非捕获 组((?:...))。

【讨论】:

  • 但是,引擎(pcre)是否支持“和”条件,就像“或”一样?我想检查那种方式,比如....匹配这个,或者这个和这个。
  • 这就是分组的用途。匹配a1b2,然后匹配c3 => (a1|b2)c3。您在此处期望的 & 条件只是一系列强制性(=匹配至少 1 次出现)子模式。
  • 关于 但我只想要 ip-string - 您将它们放在第 2 组中。捕获组是为了在您需要访问子匹配时使用(a 的一部分)匹配)。或者,使用后视:(?<=key_one:|key_two:|key_ten:)\d{1,3}(?:\.\d{1,3}){3}\Kkey_(?:one|two|ten):\K\d{1,3}(?:\.\d{1,3}){3}
  • @kahsaykalayu:您应该更清楚& 的意思。如果您的意思是要确保有a1,然后是b2,并且它们之间可以有任何文本,您可以使用/a1.*b2/s。如果你想检查一个字符串是否有a1b2不管它们在字符串中的顺序,你可以使用/^(?=.*a1)(?=.*b2).*/s。因此,PCRE 中没有一些神奇的 & 运算符,这一切都取决于每个具体案例/场景。只有 ElasticSearch 正则表达式支持 Intersection 正则表达式与&
  • 如预期般完美,\K 选项(lookbehind)成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-16
  • 2014-11-24
  • 1970-01-01
  • 2015-08-24
  • 1970-01-01
  • 2018-10-16
相关资源
最近更新 更多