匹配器仅匹配第一个结果

时间:2016-03-09 17:19:27

标签: java design-patterns matcher

现在我正在尝试学习如何使用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)'它将无法正常工作。

英语不是我的母语,我试着尽我所能写出来,如果它有任何拼写错误我道歉。

3 个答案:

答案 0 :(得分:2)

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

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

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

实际上,通过这样做,你甚至不需要在最后的空间匹配,所以完全删除它。

结果:

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

regex101上查看结果。

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

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

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

答案 1 :(得分:0)

这个正则表达式:

effect:(\w+):(\d+)

您只需使用\w+和带有\d的数字来识别单词。要捕获的内容,请在()之间插入。详细说明如下:Regex101

在Java中它看起来像这样:

Pattern pattern = Pattern.compile("effect:(\\w+):(\\d+)");
Matcher matcher = pattern.matcher("effect:health:10 effect:speed:15 ");
while (matcher.find()) {
    System.out.println(matcher.group(1) + ": " + matcher.group(2));
}

这是输出:

health: 10
speed: 15

答案 2 :(得分:0)

我想你正在寻找类似的东西:

final Pattern pattern = Pattern.compile("effect:([^\\s$:]+):?(\\d*)");
final Matcher matcher = pattern.matcher("effect:health:10 effect:speed:15 effect:none:");
while (matcher.find()) {
    System.out.println(matcher.group(1) + ": [" + matcher.group(2) + "]");
}

输出:

health: [10]
speed: [15]
none: []