Pattern pattern = Pattern.compile("(\\S+)\\s+(.+?)\\s+(\\S+)");
Matcher matcher = pattern.matcher("IA HEART RATE 184");
所以我的问题是为什么上面的模式在第 2 组中捕获 HEART RATE。'.+' 不应该匹配一个或多个字符,包括空格字符所以第 2 组不应该捕获 HEART,因为它后面跟着一个空格那应该匹配 (.+?)\s+ 正确吗?那么为什么它匹配心率呢?
附言我正在使用 matches()
最佳答案
您还没有展示您是如何使用 matcher
的,但我猜您正在使用 its matches()
method当你真正想要的是its find()
method . matches()
需要将模式与整个 字符串进行匹配,唯一的方法是将第 2 组设为 HEART RATE
。 (如果第 2 组只是 HEART
,那么第 3 组将是 RATE
,并且会有一个与模式中的任何内容都不匹配的尾随 184
.) 如果您使用的是 find()
,则第 2 组将只是 HEART
,因为这是允许模式匹配部分字符串所需的最小子字符串。
您可能还误解了 +?
的含义。它尝试尽可能少地匹配,同时仍然导致整体匹配。 (.+?)\s+
完全能够匹配 HEART RATE
;只是它会更喜欢匹配 HEART
,只要这不会阻止模式的其余部分匹配。
关于java - 有人可以帮我澄清我对这个正则表达式的理解吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12164064/