使用以下正则表达式[{-]
似乎不需要{
转义。它是否正确?还有哪些其他字符不需要/不需要在括号表达式中转义?
答案1
请注意,有数十种不同的正则表达式风格。 POSIX 标准至少指定了 4 个(BRE、ERE、awk EREs、ex
/ vi
BRE),还有更多类似perl
、PCRE等vim
。ksh93
在POSIX BRE(由grep
/使用sed
)和埃雷(由grep -E
/sed -E
或bash
的[[ =~ ]]
1 使用),内部括号表达式( [...]
),唯一特殊的字符是^
(当第一个字符时)、 ]
(当不是第一个或后面的字符时]
)、-
(当不是第一个、最后一个或后面的字符时^
)以及当某些, , ...[
的一部分时换行符,即使本身不特殊正则表达式语法中的 正则表达式在使用正则表达式的实用程序中通常很特殊,例如分隔正则表达式的地方。[.x.]
[:class:]
[=e=]
grep
\
in those 并不特殊,理论上不能用于转义字符或用于\t
指定 TAB 之类的事情。
[\-~]
\
旨在匹配从到 的一系列字符~
。要匹配-
or ~
,则为[~-]
or [-~]
。请记住,-
需要位于第一个或最后一个,]
需要位于第一个,并且[
后面不应跟有.
,=
或:
。
{
无论如何,-
这并不特别,但不是像你那样处于最后位置时。
请注意,虽然BRE 和 ERE 中要求[\t]
和与or[t\]
匹配,但我不会依赖它,因为有几个实用程序忽略了该要求。使用or来匹配or 。\
t
[\\t]
[\\t]
\
t
例如,在 GNU 中sed
,sed 's/[\t]//'
删除 TAB 而不是\
和t
except$POSIXLY_CORRECT
位于其环境中。
¹ 有趣的是,用来bash
返回[[ '\' =~ ['.'] ]]
true ,正如所引用的.
,它会调用正则表达式引擎[\.]
作为正则表达式,试图转义此处不需要转义的点,并且 4.4 仍然无法返回 true[[ '\' =~ [^]'.'] ]]
同样的原因。