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