Java 为什么我的Matcher.find()的计算结果为false?
我有以下代码:Java 为什么我的Matcher.find()的计算结果为false?,java,regex,Java,Regex,我有以下代码: Pattern lPattern = Pattern.compile("^.*THREADINFO.*\\sJ9VMTHREAD:([0123456789xABCDEF]*).*") Matcher lMatcher = lPattern.matcher("3XMTHREADINFO \"WebContainer : 14\" J9VMThread:0x0000000085046300, j9thread_t:0x00007FC39C10BDF0, java/lang/
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
,但它没有。这个正则表达式在从输入行获取0x0000000085046300
时非常有效,这可以在在线正则表达式测试仪中看到。但是为什么这个Java代码不能打印相同的内容呢?我遗漏了什么?您的正则表达式是区分大小写的,因此没有选择J9VMThread
,因为它在正则表达式中是用大写字母拼写的。您可以使用(?i)
作为正则表达式的前缀,或者使用Pattern.compile(regex,Pattern.CASE\u不区分大小写)
来关闭大小写敏感度。您的正则表达式是区分大小写的,因此不会选择J9VMThread
,因为它在正则表达式中是用大写字母拼写的。您可以使用(?i)
作为正则表达式的前缀,或者使用模式.compile(正则表达式,模式.不区分大小写)
来关闭大小写区分。您需要将模式定义为不区分大小写,因为它现在包含J9VMTHREAD,并且您的输入包含J9VMTHREAD(小写):
您需要将模式定义为不区分大小写,因为现在它包含J9VMTHREAD,并且您的输入包含J9VMTHREAD(小写):
您的正则表达式捕获组是错误的,它甚至匹配字符串,如
0x85046300
,并且需要很多(无用的)步骤
在addiction中,您没有指定不区分大小写的标志,这就是它不匹配的原因
通过这种方式,可以大大简化正则表达式
(?i)J9VMTHREAD:([0-9]+x[0-9A-F]+)
因为我认为你想提取一个十六进制数,你可以简化它:
(?i)J9VMTHREAD:(0x[0-9A-F]+)
我希望它有帮助您的正则表达式捕获组是错误的,它甚至匹配字符串,如
0x85046300
,并且需要很多(无用的)步骤
在addiction中,您没有指定不区分大小写的标志,这就是它不匹配的原因
通过这种方式,可以大大简化正则表达式
(?i)J9VMTHREAD:([0-9]+x[0-9A-F]+)
因为我认为你想提取一个十六进制数,你可以简化它:
(?i)J9VMTHREAD:(0x[0-9A-F]+)
我希望这有帮助是的!请注意,在线正则表达式检查与java中的行为不同。是的!请注意,在线正则表达式检查与java中的行为不同。
Pattern lPattern = Pattern.compile("^.*THREADINFO.*\\sJ9VMTHREAD:([0123456789xABCDEF]*).*", Pattern.CASE_INSENSITIVE);