我有一个旧应用程序,它使用扩展 POSIX 正则表达式来评估返回码以做出一些决定。
返回代码示例:
RETCODE = 0 SUCCESS
RETCODE = 3007 ERR3007
RETCODE = 3001 ERR3001
RETCODE = 13007 ERR13007
RETCODE = 3 ERR3
RETCODE = 1 ERR1
当返回码为 0 或 3007 时,我写了一个考虑成功的正则表达式:“.*RETCODE = (0|3007).*”
现在我需要另一个正则表达式来考虑 FAILURE 当返回码是其他任何东西时。这意味着,当返回码既不是 0 也不是 3007 时。
注意 1:我的应用程序仅将“^”视为否定字符。
注意 2:我使用命令“egrep”测试表达式
你能帮我解决这个问题吗?
提前致谢。
伊万.
POSIX 扩展正则表达式不支持否定先行断言。然而,正则语言的补语本身又是正则的,所以你可以为此编写一个正则表达式,它真的很笨拙,即使你不打算精确否定匹配:
RETCODE = ([124-9][0-9]*|3|30|3[1-9][0-9]*|30[1-9][0-9]*|300|300[01-689][0-9]*|3007[0-9]+)[ ]
根据经验,当您按大小列出允许的模式时,用 ERE 否定一些具有不同长度的文字字符串会更容易。
按照这种思路,
0
OR3007
的否定将用以下规则表示:
0
3
0
0
7
在 ERE 术语中,您将编写如下内容:
[^0]|.{2,3}|[^3]...|.[^0]..|..[^0].|...[^7]|.{5,}
警告:我正在使用
.
而不是[0-9]
,[^0]
而不是[1-9]
,等等......因为最终的正则表达式将明确地锚定在输入行中。
例子:
cat <<'EOF' |
RETCODE = 3007 ERR3007 # will be filtered out
RETCODE = 3001 ERR3001
RETCODE = 13007 ERR13007
RETCODE = 0 ERR0 # will be filtered out
RETCODE = 3 ERR3
RETCODE = 1 ERR1
RETCODE = 300 ERR3
RETCODE = 0007 ERR0007
RETCODE = 030070 ERR030070
RETCODE = 00 ERR00
RETCODE = 3000 ERR3000
EOF
grep -E '= ([^0]|.{2,3}|[^3]...|.[^0]..|..[^0].|...[^7]|.{5,}) E'
输出:
RETCODE = 3001 ERR3001
RETCODE = 13007 ERR13007
RETCODE = 3 ERR3
RETCODE = 1 ERR1
RETCODE = 300 ERR3
RETCODE = 0007 ERR0007
RETCODE = 030070 ERR030070
RETCODE = 00 ERR00
RETCODE = 3000 ERR3000