如何在 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.33
、grep2.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.
有些工具可能有其他方法可以通过某种转义来完成此操作,但将它放在最前面或最后总是安全的。请注意 -
不是唯一具有不同行为的字符,具体取决于它在括号表达式中的显示位置。还要考虑 ]
和 ^
。
我有一个包含如下值的 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.33
、grep2.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.
有些工具可能有其他方法可以通过某种转义来完成此操作,但将它放在最前面或最后总是安全的。请注意 -
不是唯一具有不同行为的字符,具体取决于它在括号表达式中的显示位置。还要考虑 ]
和 ^
。