Bourne Shell 有正则表达式验证器吗?

Sco*_*e H 7 linux regular-expression bourne-shell

我使用的是封闭网络(即没有连接到互联网)。

我有一个 bourne shell 脚本,要求用户输入与grep -P.

一般来说,我喜欢进行某种形式的输入验证。
有没有办法测试字符串变量以查看它是否是(有效的)正则表达式?
(可以将互联网上的内容复制到我的系统上,但这需要很长时间,而且是 PITA——因此我正在寻找在本地完成此操作的方法。)

cas*_*cas 19

不,但是使用某些工具,测试正则表达式是否可以编译并不困难。

例如,使用 grep: echo | grep -P '['- 退出代码 ,$?将为2,表示发生了错误(对于本例,grep 将打印“ grep: Missing termination ] for character class ”到 stderr - 您可以将 stderr 重定向到 /dev/null如果您只想要退出代码)。

退出代码 1 表示正则表达式编译正常,但与输入不匹配。

这些退出代码特定于 GNU grep。其他工具,即使有这样的功能,也可能有不同的退出代码,以及指示特定类型错误的不同方式。

请注意,这与告诉您正则表达式是否正确匹配您想要的内容(而不匹配您不想要的内容)还差得很远。

简而言之,尝试一下并测试退出代码。并了解你的工具。

  • @terdon 是的,我考虑在该示例中添加注释(实际上是 `grep .nosuchfile`),但是,在将空行输入 grep 的情况下,这种情况永远不会发生(对于权限错误也是如此),所以我将其删除。正如你所说,GNU grep 中的退出代码“2”并不意味着“正则表达式错误”,它只是意味着“错误”。然而,在这种情况下,没有其他可能的情况(除了 OOM 或可能由于缺乏资源而导致的管道错误或由于更大的系统问题(例如 CPU 或 RAM 故障)而引起的其他问题),这远远超出了检查 RE 有效性的简单方法的范围) (5认同)
  • 我认为这里不需要管道 - 只需从空设备获取输入:`grep "$re" /dev/null 2>/dev/null`。如果 `/dev/null` 不存在,你就会遇到更大的问题!(顺便说一句:我的 GNU grep 版本 - 3.6 和 3.8 - 有不同的错误消息。它只是“_grep:无效的正则表达式_”,它的信息量不如你的)。 (4认同)
  • 我记得使用过一个古老的 grep。没有任何无效的正则表达式。例如,未封闭的类将被强制重新解释为文字 [。 (3认同)
  • @TobySpeight,因为我碰巧测试过,从 `/dev/null` 重定向似乎不适用于 Busybox,例如 `busybox grep -e '[' < /dev/null` 只是以状态 1 退出,没有注释。如果没有输入,看起来它不会编译正则表达式。我没想到会出现这样的选择,但这并不完全错误,因为空输入无论如何都没有什么可匹配的。 (2认同)
  • @ilkkachu 对。测试应该是`$? -gt 1`而不是`$?-eq 2` (2认同)
  • @TobySpeight我找出了错误消息的差异。使用“-P”,GNU grep 输出更详细的错误消息。对于BRE(默认或`-G`)或ERE(`-E`),它只输出“grep:无效的正则表达式” (2认同)