使用Regex提取捕获组

时间:2014-11-07 19:03:08

标签: java regex

我只是想捕获一个包围静态文本的字符串。我将举例说明。这是我正在使用的字符串......

String idInfo = "Any text up here\n" +
                "Here is the id\n" +
                "\n" +
                "?a0 12 b5\n" +
                "&Edit Properties...\n" +
                "And any text down here";

或者漂亮的印刷品......

Any text up here
Here is the id

?a0 12 b5
&Edit Properties...
And any text down here

我正在使用以下代码尝试打印ID号...

Pattern p = Pattern.compile("Here is the id\n\n\?[a-z0-9]{2}( [a-z0-9]{2}){2}\n&Edit Properties...);
Matcher m = p.matcher(idInfo);
String idNum = m.group(1);
System.out.println(idNum);

我想简单地输出ID号,所以我希望这个例子的输出是......

a0 12 b5

然而,我得到了一个"没有找到匹配"我运行代码时出现异常。我究竟做错了什么?是否有更简单,更优雅的方式来完成我的解决方案?

1 个答案:

答案 0 :(得分:2)

在使用之前,您需要让Matcher find匹配。因此,在访问m.find()之前,请先调用m.matches()(或m.group(1);,具体取决于您的目标)。同时检查是否确实找到了匹配项(如果m.find()已重新调整true),以确保第1组存在。

其他的事情是代表你的正则表达式的字符串是不正确的。如果要在正则表达式中转义?,则需要将\写为两个"\\",因为\是String中的特殊字符(例如用于创建\n )还需要逃避。

您在评论中指出的最后一件事是,( [a-z0-9]{2})不会在第1组中放置匹配a0 12 b5。要解决此问题,我们需要在括号中包围[a-z0-9]{2}( [a-z0-9]{2}){2}。 / p>

所以尝试一下

Pattern p = Pattern.compile("Here is the id\n\n\\?([a-z0-9]{2}( [a-z0-9]{2}){2})\n&Edit Properties...");
Matcher m = p.matcher(idInfo);

if (m.find()) {//or while(m.find())
    String idNum = m.group(1);
    System.out.println(idNum);
}