为什么我的正则表达式不匹配大写字符和下划线?

时间:2014-12-14 11:00:24

标签: java regex string syntax

我有以下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或是下划线

这里发生了什么?!?

2 个答案:

答案 0 :(得分:2)

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

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

如果您打算使用元字符进行边界匹配,则行的开头为^,行的末尾为$

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

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

答案 1 :(得分:0)

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

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

可以进一步缩短到:

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

由于\\w相当于[a-zA-Z0-9_](单词字符)