java - 有人可以帮我澄清我对这个正则表达式的理解吗?

标签 java regex

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/

相关文章:

java - Android:传递 Activity 类时为 "Expression expected"

java - 不会从 SharedPreferences 加载值 - 在计算中使用它们时,它们看起来是空白的

java - 如何通过在弹出对话框中按“确定”按钮来正确启动 nextQuestion 方法?

java - 在给定内存限制的情况下对具有大量数据的文件进行排序

php - php 正则表达式中具有相同名称的两个组

Windows 关闭时 Java 退出

html - Grep linux 正则表达式在 html 源代码中

c# - 如何强制正则表达式的部分匹配?

php - 正则表达式来检测写成单词的数字

java - 找到随后的数字行(由非字母字符分隔)并计算它们