扩展的 Posix 正则表达式 - 使用“^”否定多个字符串

问题描述 投票:0回答:2

我有一个旧应用程序,它使用扩展 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”测试表达式

你能帮我解决这个问题吗?

提前致谢。

伊万.

regex posix regex-negation
2个回答
1
投票

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]+)[ ]

0
投票

根据经验,当您按大小列出允许的模式时,用 ERE 否定一些具有不同长度的文字字符串会更容易。

按照这种思路,

0
OR
3007
的否定将用以下规则表示:

  1. 允许任何不是
    0
  2. 的单位数字
  3. 允许任何两位数
  4. 允许任何三位数
    • 允许任何四位数,只要它不以
      3
    • 开头
    • 允许任何四位数,只要第二位不是
      0
    • 允许任何四位数,只要第三位不是
      0
    • 允许任何四位数,只要它不以
      7
    • 结尾
  5. 允许任何至少有 5 位数的数字

在 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
© www.soinside.com 2019 - 2024. All rights reserved.