Regex 否定/倒排字符类无法匹配perl中的方括号

Regex 否定/倒排字符类无法匹配perl中的方括号,regex,perl,Regex,Perl,在下面的语法中, 我希望不是拉丁26个字母的字母表中的每个字符都能转换成下划线。 但是,正如我们所看到的,方括号不被认为是该字符类中的字符: > printf '%s' 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-za-z]/_/g;'; echo; dog[__]cat > perl --version This is perl 5, version 18, subversion 4 (v5.18.4) b

在下面的语法中, 我希望不是拉丁26个字母的字母表中的每个字符都能转换成下划线

但是,正如我们所看到的,方括号不被认为是该字符类中的字符:

> printf '%s' 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-za-z]/_/g;'; echo;
dog[__]cat
> perl --version

This is perl 5, version 18, subversion 4 (v5.18.4) built for darwin-thread-multi-2level
(with 2 registered patches, see perl -V for more detail)

为了得到我想要的,我必须明确地提到方括号,如下所示:

> printf '%s' 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-za-z]/_/g; s/[\[\]]/_/g;'; echo;
dog____cat
否定/倒置的概念似乎很简单;我错过了什么


还有一种更优雅的说法来实现我想要的,例如不使用两个顺序替换吗?

字符集
[^a-za-z]
包括
a-z
而不是
a-z
——也就是说,它包括大写
a
和小写
z
之间的ASCII格式的所有内容,包括
Z
a
之间的点号:

⋮
X
Y
Z
[
\
]
^
_
`
a
b
c
⋮
[^A-za-z]
更改为
[^A-za-z]
应该可以解决它。

我的错误是双重的

  • 如响应者所指出的手写字符中的粗心错误
  • 我对posix类的无知(也要感谢响应者),虽然我见过它很多次,但从来没有学过它

  • s/[^[:alpha:]/ug/g;'
    可以,但我无法解释为什么你的版本不起作用,所以我不会写一个答案:-)哈,我错过了小写的
    z
    。使用预定义的字符类有一些优点,如
    [:alpha::
    :-)@Ted lynmo谢谢!
    ~/u/kh/bin> echo 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^A-Za-z]/_/g;'; echo;
    dog____cat_
    ~/u/kh/bin> echo 'dog[-1]cat' | perl -p -e 'use strict; use warnings; s/[^[:alpha:]]/_/g;'; echo;
    dog____cat_
    ~/u/kh/bin>