我不能使用模式这样的"abc_def"这样的组名

MrJ*_*s0n 4 java regex

我有一系列必须编译的模式的问题.这是一个例子:

...(?<NOT>\bNOT\b)|(?<LEFT_PAR>\()|(?<RIGHT_PAR>\))...
Run Code Online (Sandbox Code Playgroud)

这些组名"LEFT_PAR"和"RIGHT_PAR"引发异常:

Exception in thread "main" java.util.regex.PatternSyntaxException: 
named capturing group is missing trailing '>'
Run Code Online (Sandbox Code Playgroud)

我很确定下划线是问题所在.在线搜索我没有找到任何有用的东西,我无法理解为什么当我看到python中的示例工作得很好时,这会导致我这个问题.我已经读过它被视为Java Patterns中的普通char.显然,如果我删除它,它的效果很好.

你能帮我吗?:) 谢谢.

编辑:

 public enum Patterns(){
   NOT("\\bNOT\\b"),
   LEFT-PAR("\\("), 
   RIGHT-PAR("\\)"); [...] 
 }
 //i'm cutting enum constructor and toString() method...

//That's the part of the method that uses enum

StringBuilder allPatterns = new StringBuilder();

//This loop creates a unique group of patterns (key-value)
for (validTokens t : validTokens.values()) 
    allPatterns.append("|(?<" + t.name() + ">" + t + ")");

//Compile all Patterns and create a group
Pattern pattern = Pattern.compile(allPatterns.toString().substring(1)); //ERROR 
Run Code Online (Sandbox Code Playgroud)

由于项目的具体细节,我无法更改任何名称.这个方法和enum工作到现在为止...这_毁了所有xD如果你可以帮我解决,请.谢谢.

use*_*ica 8

来自文档:

还可以为捕获组分配"名称",命名捕获组,然后通过"名称"对其进行反向引用.组名由以下字符组成.第一个字符必须是一个字母.

  • 大写字母'A'到'Z'('\ u0041'到'\ u005a'),
  • 小写字母'a'到'z'('\ u0061'到'\ u007a'),
  • 数字'0'到'9'('\ u0030'到'\ u0039'),

下划线是被禁止的.请记住,不同的语言有不同的正则表达方言; 在Python中工作的东西可能不适用于Java,反之亦然.