Java中的正则表达式分组

Java中的正则表达式分组,java,regex,pattern-matching,package,Java,Regex,Pattern Matching,Package,我希望清除除类名之外的所有内容,去掉完全限定的类名。所以,我可能有点像 "class gqlMain.Node" 。。。我想以…结束 "Node" …我很确定我的模式 "*.[\\.][^\\.]*" ..是正确的,如果只需按上述方式运行并使用 myMatcherObject.matches() …它总是返回true,但当我尝试添加分组时,例如 "(.*[\\.])([^\\.]*)" …我总是收到“未找到匹配项”错误。不知道发生了什么事 增加: 谢谢你们的快速回复,伙计们。是的,我真

我希望清除除类名之外的所有内容,去掉完全限定的类名。所以,我可能有点像

"class gqlMain.Node"
。。。我想以…结束

"Node"
…我很确定我的模式

"*.[\\.][^\\.]*"
..是正确的,如果只需按上述方式运行并使用

myMatcherObject.matches()
…它总是返回true,但当我尝试添加分组时,例如

"(.*[\\.])([^\\.]*)"
…我总是收到“未找到匹配项”错误。不知道发生了什么事

增加:

谢谢你们的快速回复,伙计们。是的,我真的不明白。我的确切密码是

public String toString() {
    Pattern packagePatt = Pattern.compile("(.*[\\.])([^\\.]*)");
    // 
    System.out.println(this.compClass.getName().toString());

    Matcher packageMatch = packagePatt.matcher(this.compClass.getName().toString());

    //
    System.out.println(packageMatch.group(2));
    return packageMatch.group(2);
}
例如,第一个print语句生成一个类似“gqlMain.Node”的字符串(我知道toString()是多余的,出于愤怒我添加了它)。第二条print语句产生错误,return语句也会产生错误。通过调试器,我可以看到Matcher对象的组列表在每个索引处都保持为空。但是如果我插入一个

if (packageMatcher.matches()) {
    // print true
}

。。。我总是说“真的”。这真的毫无意义

以下程序报告为“真”:

完整输出为:

true
class gqlMain.Node
class gqlMain.
Node

我不建议以这种方式扫描标识符(但我相信您不希望过度设计),并且您可能会喜欢下面的解决方案,该解决方案通常对扫描标识符更严格(但是,坦率地说,我不认为我也在以最正确的方式扫描标识符)。此外,它可以在单个字符串中扫描多个完全/部分限定的标识符,但完全忽略非限定的标识符(例如,
class
不明确)

包堆栈溢出;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
导入静态java.lang.System.out;
导入静态java.util.regex.Pattern.CASE_,不区分大小写;
导入静态java.util.regex.Pattern.compile;
公开期末班Q11554180{
私人Q11554180(){
}
//
//(3)与第(1)项相同,但我们------------------------------------------------+
//捕获组以获取类|
//仅此而已|
//(2)至少需要一个程序包名称-------------------------------+|
//(1)我们只搜索有效的包名----------------+||
//我们不需要捕捉它吗?:||
//                                              +----------------+--------------+|+-------------+-------------+
//                                              |                               |||                           |
private static final Pattern Pattern=compile((?:[\\p{Alnum}\[\\p{Alnum}\\]*\\)+([\\p{Alpha}\\\[\\p{Alnum}\\]*)”,不区分大小写);
专用静态无效查找(字符序列){
最终匹配器匹配器=模式匹配器;
while(matcher.find()){
out.println(matcher.group(1));
}
}
公共静态void main(字符串[]args){
查找(“类gqlMain.Node;类gqlMain.p1.NodeA”);
查找(“类gqlMain.p1.p11.NodeB”);
查找(“类gqlMain.p1.p11.p111.NodeC”);
查找(Q11554180.class.getCanonicalName());
}
}
上述代码将产生以下输出:

Node
NodeA
NodeB
NodeC
Q11554180

“[\\.][^\.]”和“(.[\\.])([^\.]*)”是不一样的,尽管我本以为第二个会起作用。注意第一个正则表达式开头的“*”。我同意teambob的观点。但是,我觉得
\\
不应该在那里。\\很好,但没有必要,我试图尽可能地匹配@MassStrike的代码。首先,我们匹配任何字符“*”。然后,我们匹配除文字句号/句号以外的任何字符-通常需要转义句号,但在字符规范中不需要转义句号。然后,第二组匹配除文字句号以外的任何字符。实际上,如果我们删除所有不必要的字符,我们就可以“(.\\。)([^.]*)或“(.*[.])([^.]*)”-其工作原理完全相同。
Node
NodeA
NodeB
NodeC
Q11554180