【问题标题】:False [] range in regex [duplicate]正则表达式中的 False [] 范围 [重复]
【发布时间】:2019-11-24 21:39:16
【问题描述】:

我正在使用正则表达式来检查文件的名称。现在 Intellij 的控制台向我显示了这条消息:

False [] 正则表达式中的范围“\w-”;由 标记 m/^deploy-file-\d+_[\w _.]+\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

【问题讨论】:

  • 只需在最后n个字符类中添加-,即将这个[\w-_.]改成[\w_.-]这个
  • @CodeManiac 这两者有什么区别?
  • - in between character class 代表范围

标签: regex perl


【解决方案1】:

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

[\w\-_.]

(请注意,并非所有正则表达式引擎都接受未转义的破折号,因为它位于末尾,所以我一般不推荐它)。

【讨论】:

  • - 将被视为范围Related question 的所有情况下并非如此
  • @CodeManiac 我没有得到你的评论。您确定您已正确阅读我的答案吗?仅仅是配方吗?
  • @DenysSéguret 我的意思是- 在字符之间总是不表示范围,只需阅读我在评论中发布的问题链接
  • @CodeManiac 如果您阅读我的回答,您会发现我很清楚这一点。并且不要在不充分了解引擎的情况下使用该技巧:它取决于引擎和版本
  • 这个问题与 JS 无关;这是关于 Perl 的。正则表达式语言有很多,就像编程语言有很多一样。
【解决方案2】:

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

[a-z]

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

[\w\-_.]

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

[\w_.-]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 2021-12-19
    • 1970-01-01
    相关资源
    最近更新 更多