gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:49:28 25 4
gpt4 key购买 nike

我有一个充满如下值的 csv 文件:

0.00145423,3.03795e-05

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

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

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

[编辑]这不会发生在 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 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.

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

关于regex - 如何在 POSIX 正则表达式中将连字符转义为字符范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56494851/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com