【问题标题】:Why isn't my regex matching uppercase characters and underscores?为什么我的正则表达式不匹配大写字符和下划线?
【发布时间】:2014-12-14 11:00:23
【问题描述】:

我有以下 Java 代码:

public static void main(String[] args) {
    String var = "ROOT_CONTEXT_MATCHER";
    boolean matches = var.matches("/[A-Z][a-zA-Z0-9_]*/");
    System.out.println("The value of 'matches' is: " + matches);
}

打印:The value of 'matches' is: false

为什么我的var 不匹配正则表达式?如果我正确读取我的正则表达式,它匹配任何字符串:

  • 以大写字符 A-Z 开头;那么
  • 由零个或多个组成:
    • 小写字符 a-z;或
    • 大写字符 A-Z;或
    • 数字 0-9;或
    • 下划线

字符串“ROOT_CONTEXT_MATCHER”:

  • 以 A-Z 字符开头;和
  • 由 19 个后续字符组成,全部为大写字母 A-Z 或下划线

这是怎么回事?!?

【问题讨论】:

  • 你的字符串不是以/开头或结尾的

标签: java regex string syntax


【解决方案1】:

问题在于正则表达式开头和结尾的正斜杠字符。它们在这里没有任何特殊含义,被视为文字。只需删除它们即可修复:

boolean matches = var.matches("[A-Z][a-zA-Z0-9_]*");

如果您打算使用元字符进行边界匹配,正确的字符是 ^ 用于行首,$ 用于行尾:

boolean matches = var.matches("^[A-Z][a-zA-Z0-9_]*$");

虽然这里不需要这些,因为String#matches 会匹配整个字符串。

【讨论】:

  • 匹配有 ^ 和 $ 隐含。
【解决方案2】:

您需要从 Java 正则表达式中删除 正则表达式分隔符,即 /:

boolean matches = var.matches("[A-Z][a-zA-Z0-9_]*");

这可以进一步缩短为:

boolean matches = var.matches("[A-Z]\\w*");

因为\\w 等价于[a-zA-Z0-9_](单词字符)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    相关资源
    最近更新 更多