如何在 POSIX 正则表达式中将连字符转义为字符范围

How do you escape a hyphen as character range in a POSIX regex

我有一个包含如下值的 csv 文件:

0.00145423,3.03795e-05

我想检查所有行是否一致,所以我尝试 grep 查找任何意外字符,例如...

grep '[^0-9,e\-\.]' myfile

在我看来,它是这样的:找到一行 [] 不是 ^ 数字 0-9、逗号 ,、字母 e e、连字符 \- 试图用 \ 转义)或句点 \.。但是,连字符仍会继续匹配。

[EDIT]这不会发生在 python,只有 bash/grep:

>>> re.search("[^0-9,e\-\.]", "0.00145423,3.03795e-05")
>>> 

不满意的解决方案:
如果我将转义的连字符移到末尾,它会起作用:

grep '[^0-9,e\.\-]' myfile

将转义的连字符放在 0-9 范围旁边会导致 grep: Invalid range end.

谁能解释一下这是怎么回事?这是一些 bash 参数解析问题还是 grep 特有的问题?

bash4.3.33grep2.21

记住 - 是一个范围运算符,所以 \-\ 匹配范围 \\ 中的任何字符,这正好是一个 \ .

如果你把它移到最后,它会失去它作为范围的意义,这就是它起作用的原因。

在字符列表中包含文字 - 的方法是将其放在括号表达式的第一个或最后一个位置,完全如答案所示:Get final special character with a regular expression.

来自POSIX 9.3.5 RE括号表达式:The <hyphen> character shall be treated as itself if it occurs first (after an initial '^', if any) or last in the list, or as an ending range point in a range expression.

有些工具可能有其他方法可以通过某种转义来完成此操作,但将它放在最前面或最后总是安全的。请注意 - 不是唯一具有不同行为的字符,具体取决于它在括号表达式中的显示位置。还要考虑 ]^