匹配字符串中可选单词前后的内容

时间:2018-08-20 10:07:59

标签: regex pattern-matching pcre

我有以下几行:

After=netfilter-persistent.service network-online.target docker.socket firewalld.service
After=network-online.target docker.socket firewalld.service netfilter-persistent.service
After=anothertest netfilter-persistent.service network-online.target docker.socket firewalld.service
After=network-online.target docker.socket firewalld.service

我是

  1. 寻找一个正则表达式来捕获After=之后,netfilter-persistent.service之前和之后的内容,以及
  2. 如果After=不存在,则netfilter-persistent.service之后的所有内容。

此正则表达式执行1,但不执行2:

^After=(.*?)?(?:netfilter-persistent\.service)(.*?)?$

此正则表达式执行2,但不执行1:

^After=(.*?)?(?:netfilter-persistent\.service)?(.*?)?$

这个很接近,但是netfilter-persistent.service仍然在第1组:

^After=(.*?(?:netfilter-persistent\.service))?(.*?)?$

1 个答案:

答案 0 :(得分:2)

您可以使第一个组在最后一个模式中不被捕获,并将.*?与捕获组一起使用

^After=(?:(.*?)netfilter-persistent\.service)?(.*)$

请参见regex demo

详细信息

  • ^After=-字符串开头的After子字符串
  • (?:(.*?)netfilter-persistent\.service)?-可选序列:
    • (.*?)-第1组:除换行符以外的任何0+个字符,并且尽可能少
    • netfilter-persistent\.service-一个netfilter-persistent.service子字符串
  • (.*)-第2组:除换行符以外的任意0+个字符,最多......
  • $-字符串的结尾。