为什么我的Matcher.find()评估为false?

时间:2015-10-08 12:09:42

标签: java regex

我有以下代码:

Pattern lPattern = Pattern.compile("^.*THREADINFO.*\\sJ9VMTHREAD:([0123456789xABCDEF]*).*")
Matcher lMatcher = lPattern.matcher("3XMTHREADINFO      \"WebContainer : 14\" J9VMThread:0x0000000085046300, j9thread_t:0x00007FC39C10BDF0, java/lang/Thread:0x000000000B2E08E8, state:B, prio=5")
if(lMatcher.find())
    println lMatcher.group(1)

我觉得它应该打印0x0000000085046300,但事实并非如此。正如在线正则表达式测试器here中所见,此正则表达式非常适合从输入行获取0x0000000085046300。但那么为什么这个Java代码无法打印出来呢?我缺少什么?

3 个答案:

答案 0 :(得分:5)

你的正则表达式区分大小写,因此没有拿起J9VMThread,因为它在你的正则表达式中拼写为全部大写。您可以使用(?i)为正则表达式添加前缀,或使用Pattern.compile(regex, Pattern.CASE_INSENSITIVE)关闭区分大小写。

答案 1 :(得分:4)

你的正则表达式捕获组是错误的,它甚至匹配0x0x0x0x0x0x0x0x0x85046300之类的字符串,并且需要很多(无用的)步骤。

瘾,你没有指定不区分大小写的标志,这就是它不匹配的原因。

你可以用这种方式简化你的正则表达式

(?i)J9VMTHREAD:([0-9]+x[0-9A-F]+)

由于我认为你想提取一个十六进制数,你可以更简化它:

(?i)J9VMTHREAD:(0x[0-9A-F]+)

我希望它有所帮助

答案 2 :(得分:2)

您需要将模式定义为不区分大小写,因为它现在包含J9VMTHREAD并且您的输入包含J9VMThread(小写):

Pattern lPattern = Pattern.compile("^.*THREADINFO.*\\sJ9VMTHREAD:([0123456789xABCDEF]*).*", Pattern.CASE_INSENSITIVE);