我正在尝试创建一个正则表达式字符类,它只匹配只包含以下一个或多个字符的字符串,而不包含任何其他字符。在
:
a
l
p
h
。在当然,我可以做一些简单的事情,这样就行了。在
$ printf "foo\nhal\npal\na:h\n" | grep '^[:alph]*$'
hal
pal
a:h
但是如果我尝试这样做,比如在character类中使用冗余字符,我会得到一个错误。在
^{pr2}$现在,我知道怎么回事了。grep
“相信”我错写了{
但是[:alpha:]
不是POSIX中有效的正则表达式吗?它真的应该为有效的正则表达式抛出错误吗?它不应该警告我我可能是指[[:alpha:]]
?在
事实上,如果我在正则表达式中使用[:alpha:]
,那么sed
一点也不抱怨。它的行为与[:alph]
完全相同。我相信sed
做得对。在
$ printf "foo\nhal\npal\na:h\n" | sed -n '/^[:alpha]*$/p'
hal
pal
a:h
Python也做了正确的事情。在
>>> import re
>>> re.search('^[:alpha:]*$', 'foo')
>>> re.search('^[:alpha:]*$', 'hal')
<_sre.SRE_Match object at 0x7f33d4060f38>
>>> re.search('^[:alpha:]*$', 'pal')
<_sre.SRE_Match object at 0x7f33d4060920>
>>> re.search('^[:alpha:]*$', 'a:h')
<_sre.SRE_Match object at 0x7f33d4060f38>
只有grep
才想聪明点,告诉我我不是说[:alpha:]
,而是说[[:alpha:]]
。在
POSIX的标准是什么?它允许正则表达式引擎为[:alpha:]
抛出错误,还是要求引擎将[:alpha:]
视为{
如果能逐字引用POSIX标准的相关摘录及其URL,我会认为我的问题得到了回答。在
你说得很对,“},我认为写它的人更可能是在犯错误,而不是真正的意思是什么是严格写的。在
grep
[试图]聪明一点,告诉我我不是说[:alpha:]
,而是说[[:alpha:]]
”,我个人认为这不是一件非常糟糕的事情——如果grep
在一个表达式中看到{你也对,这种(可以说是有帮助的)行为没有conform to POSIX。不过,我注意到,GNU
grep
受环境变量POSIXLY_CORRECT
的影响,该变量改变其行为,使其符合POSIX。还有一个note on the man page,上面写着:比较:
有。在
^{pr2}$因此,如果你真的不想这样做的话,你似乎可以关掉这种“有益”的行为。在
相关问题 更多 >
编程相关推荐