我只是想捕获一个包围静态文本的字符串。我将举例说明。这是我正在使用的字符串......
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
然而,我得到了一个"没有找到匹配"我运行代码时出现异常。我究竟做错了什么?是否有更简单,更优雅的方式来完成我的解决方案?
答案 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);
}