我有以下代码:
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代码无法打印出来呢?我缺少什么?
答案 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);