java - 匹配器仅匹配第一个结果

标签 java design-patterns matcher

现在我正在尝试学习如何使用匹配器、模式和所有这些东西,但是我遇到了问题并且无法解决它,我确信我做错了但是我不知道什么,所以我来这里寻求帮助,这是我的代码:

public static void main(String[] args) {
    Pattern pattern = Pattern.compile("effect:([^:]*)(?::([^:]*))?(\\s)");
    Matcher matcher = pattern.matcher("effect:health:10 effect:speed:15 ");
    while (matcher.find()) {
        System.out.println(matcher.group(1));
        System.out.println(matcher.group(2));
    }
}

我想要做的是从字符串中获取效果及其持续时间,但效果持续时间并不是 100% 必要的,现在的问题是它只检测第一个效果,而不是第二个效果,它打印“健康”和“10”,它需要在末尾有一个空格,否则它不起作用,但如果我删除“(\\s)”它将不起作用。

英语不是我的母语,我尽力写得最好,如果有任何拼写错误,我深表歉意。

最佳答案

首先,由于您似乎并不关心捕获空间,因此删除有关它的捕获组。

其次,由于空格可能是可选的,因此添加 ? .

现在,这会引起麻烦,因为 [^:]将消耗空间,因此还要从捕获的值中排除空格。

实际上,通过这样做,您甚至不需要匹配末尾的空格,因此将其完全删除。

结果:

Pattern.compile("effect:([^:\\s]*)(?::([^:\\s]*))?")

查看 regex101 上的结果.

<小时/>

由于正则表达式find()只会跳过“坏”数据,您可能需要添加额外的保护条件,例如如果输入是 "supereffect:a:b:c:d" ,是否要匹配并返回a/b ,或者应该跳过它。

要跳过这一点,您可以添加保护条件,即匹配的模式必须:

  • 从开头或空格后开始:(?<=^|\\s)
  • 结束或以空格结束:(?=\\s|$)
Pattern.compile("(?<=^|\\s)effect:([^:\\s]*)(?::([^:\\s]*))?(?=\\s|$)")

关于java - 匹配器仅匹配第一个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35898304/

相关文章:

java - 异常 JSF 从数据库中删除

PHP FTP/SFTP 开关类

javascript - Jquery 不良做法

java - 为什么我不能将用户输入添加到前端为 java 和后端为 mysql 的数据库中?

java - android setText 与 getString 使用变量名

java - 将许多 'if else' 语句转换为更简洁的方法

c# - 工厂模式构建许多派生类

java - Hamcrest isEqualIgnoringWhitespace 不忽略空格

scala specs2 - 如何匹配匹配器或条件列表?

Java正则表达式用于匹配字符串中的多个键