基于属性及其值的存在的正则表达式

Regex based on presence of attribute and its value

我有一个关于正则表达式的问题,这里是我的文本:

1 200 file:test01.txt, action:read, User:dummy
2 201 file:test01.txt, action:write, User:dummy
3 202 file:unknown, keepalive , User:dummy
4 450 file:test01.txt, action:read, User:dummy
5 500 file:test01.txt, action:read, User:dummy
6 201 profiles, action:reload, User:dummy

我想处理所有行,其中:

  1. 第二列在 20[012]
  2. 未读取操作
  3. 不存在操作

所以我会匹配:

2 201 file:test01.txt, action:write, User:dummy
3 202 file:unknown, keepalive , User:dummy
6 201 profiles, action:reload, User:dummy

我正在寻找一种方法来获取行 where: action is different with read and where action doesn't appear

我尝试了很多方法都没有成功,这是我最后一次失败,第一行幸存...

^\d+\s+(?<code>(20[012])).*(action:(?<!read))?

https://regex101.com/r/HGESxR/1

有什么提示吗?

谢谢 马塞洛

您可以使用

^\d+\s+(?<code>20[0-2])\s(?:.*action:(?!read)(?<action>\w+)|(?!.*action)).*

regex demo

详情

  • ^ - 字符串开头
  • \d+ - 1+ 位数
  • \s+ - 1+ 个空格
  • (?<code>20[0-2]) - 组 "code":20 然后是 012
  • \s - 一个空格
  • (?:.*action:(?!read)(?<action>\w+)|(?!.*action)) - 非捕获组匹配
    • .*action:(?!read)(?<action>\w+) - 除换行字符外的 0+ 个字符,尽可能多,action: 子字符串,然后 Group "action" 捕获任何 1+ 个单词字符,但不以read 字符序列
    • | - 或
    • (?!.*action) - 紧靠右边,除换行字符外,任何 0+ 个字符后不应有 action,尽可能多
  • .* - 除换行字符外的 0+ 个字符,尽可能多

由于每一行都有一致的模式,您可以使用以下正则表达式。

^(?!.*action:read\b)\d\s+20[012]\s

Demo

正则表达式引擎 (PCRE) 执行以下操作。

^                     match beginning of line
(?!                   begin negative lookahead
  .*action:read\b     match 0+ chars except newline followed by
                      'action:read' followed by a word break
)                     end negative lookahead
\d\s+20               match a digit, 1+ spaces, '20'
[012]                 match '0', '1' or '2'
\s                    match a space

如果您想匹配满足这两个要求的整行(而不是仅仅确定是否满足要求),请将 .* 添加到正则表达式的末尾。 Demo

由于固定在行首的否定前瞻不消耗任何字符,因此当 \d 匹配时,引擎的内部指针位于行首。