正则表达式中错误的[]范围

时间:2019-07-16 07:45:05

标签: regex perl

我正在使用正则表达式检查文件名。现在,Intellij的控制台向我显示此消息:

  

在正则表达式中为假[]范围“ \ w-”;在 <-HERE   m / ^ deploy-file- \ d + _ [\ w <-HERE _。] + \ d + .log $ / at ...

代码

elsif ($filename =~ m/^deploy-file-\d+_[\w-_.]+\d+\.log$/) {
   print "$filename match with pattern\n";
}

我想说的是,一切都正常,并且该模式到目前为止工作正常。 我的问题是,为什么intellij向我显示此消息?问题是什么? 对程序有影响吗?

我的模式也适用于https://regex101.com/r/Lj2r4r/2

2 个答案:

答案 0 :(得分:5)

-bracketed character classes[...])中是特殊的。可以用来指定ranges of characters

[a-z]

但是,您指定的范围([\w-_])没有任何意义。您大概是要从字面上匹配_,这可以通过转义-来实现。

[\w\-_.]

-放在字符类的开头或结尾也可以。

[\w_.-]

答案 1 :(得分:3)

字符集中的破折号(在[]之间)通常用于定义范围。您应该将破折号移到设置定义的末尾,或者最好将破折号转义:

[\w\-_.]

(请注意,并非所有的正则表达式引擎都接受不转义的破折号,只是因为它在末尾,因此一般不建议这样做)。