基于属性及其值的存在的正则表达式
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
我想处理所有行,其中:
- 第二列在 20[012]
- 未读取操作
- 不存在操作
所以我会匹配:
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)).*
详情
^
- 字符串开头
\d+
- 1+ 位数
\s+
- 1+ 个空格
(?<code>20[0-2])
- 组 "code":20
然后是 0
、1
或 2
\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
正则表达式引擎 (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
匹配时,引擎的内部指针位于行首。
我有一个关于正则表达式的问题,这里是我的文本:
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
我想处理所有行,其中:
- 第二列在 20[012]
- 未读取操作
- 不存在操作
所以我会匹配:
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)).*
详情
^
- 字符串开头\d+
- 1+ 位数\s+
- 1+ 个空格(?<code>20[0-2])
- 组 "code":20
然后是0
、1
或2
\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
正则表达式引擎 (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
匹配时,引擎的内部指针位于行首。