为什么我必须在我的正则表达式中逃避`]`?

时间:2016-04-18 15:31:17

标签: regex perl

运行以下内容时出错:

perl -ne 'print unless (/[A-G][\d|\s|m|#|$]/)' file

错误:

Unmatched [ in regex; marked by <-- HERE in m/[A-G][ <-- HERE \d|\s|m|#|5.022001/ at -e line 1, <> line 1

我通过在行尾转移]来解决错误:

perl -ne 'print unless (/[A-G][\d|\s|m|#|$\]/)' file

为什么我必须逃离最后]?什么阻止支架匹配?

我注意到所有[]个匹配都不是这种情况。这是一个特例吗?

2 个答案:

答案 0 :(得分:7)

我认为$需要在那里进行转义,因为$]是用于The revision, version, and subversion of the Perl interpreter的特殊变量

答案 1 :(得分:4)

perl -ne 'print unless (/[A-G][\d|\s|m|#|$]/)' file

显然,$]被Perl解释为$]变量,其中包含当前版本的Perl。

但是正则表达式无论如何都没有多大意义。在这部分内容:

[\d|\s|m|#|$]

[]之间的文本是一系列字符或字符范围,表达式与这些字符中的任何一个都匹配。添加反斜杠:

[\d|\s|m|#|\$]

意味着它将匹配单个反斜杠,'d','s',m','$','|'或'$'字符。 (我不是百分之百确定细节。)你可能想要:

(\d|\s|m|#|$)

如果您不希望匹配的文字存储在$1

中,您可以调整一下
(?:\d|\s|m|#|$)

但这可能不值得这个单线。

此外,外括号不是必需的。把这些全部放在一起,你可能想要的是:

perl -ne 'print unless /[A-G](\d|\s|m|#|$)/' file