【问题标题】:String matches method with a plus character returns false带有加号字符的字符串匹配方法返回 false
【发布时间】:2015-10-12 23:25:47
【问题描述】:

我遇到了 if 语句错误的问题。代码如下:

if (!firstGrade.matches("A+|A|A-|B+|B|B-|C+|C|C-|D+|D|D-|F") || !firstHonors.matches("n|h|ap")) {
        System.out.println("Invalid");
        System.exit(1);
}

if 语句检查 firstGrade 是否不等于一堆值,以及 firstHonors 是否不等于 n、h 和 ap。第二部分没有问题,只有firstGrade检查导致问题。

当我尝试输入一个带加号的值(A+、B+、C+ 等)时,会出现问题,它发现它无效并退出程序。但是,根据代码,情况并非如此。

【问题讨论】:

  • String#matches 接受正则表达式。 + 是一个特殊字符。
  • 问题标题具有误导性。

标签: java string if-statement


【解决方案1】:

+- 在正则表达式中具有特殊含义,因此要真正将它们作为模式的一部分,您需要像这样转义它们:\\+

See here

【讨论】:

  • 这不起作用。如果我这样做:"A\+" 它说非法转义字符
  • @user 在字符串文字中,\ 是一个特殊的转义字符。
  • 谢谢,我编辑了答案,我会尽快将其标记为“已回答”。
  • - 仅在字符类中是特殊的,因为它可以作为[a-z] 上的范围工作,但是如果您编写[az-],它并不特殊。同样,- 在你写 a-z 时并不特殊,因为这将匹配那个文字字符串
【解决方案2】:

您需要转义加号,这在正则表达式中表示“一个或多个”。此外,您可以缩写您的表达方式:

if (!firstGrade.matches("[ABCD][+-]?|F") || !firstHonors.matches("n|h|ap")) {

你会注意到我没有转义加号或减号,因为在字符类中你不需要这些字符(特殊情况下减号是最后一个它不需要'不需要转义)。

表达式[ABCD] 是一个字符类,意思是“A、B、C 或D 中的任何单个字符”。 '[+-]? 表示“+- 的零或其中之一。


你的其他表达方式也可以缩短(感谢@Federico的建议):

if (!firstGrade.matches("[ABCD][+-]?|F") || !firstHonors.matches("[nh]|ap")) {

【讨论】:

  • n|h|ap 也可以写成[nh]|ap,因为众所周知,字符类比交替快得多。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 2019-11-04
  • 1970-01-01
  • 2019-09-03
  • 2018-12-23
  • 1970-01-01
  • 2016-11-20
相关资源
最近更新 更多