现在我正在尝试学习如何使用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)'它将无法正常工作。
英语不是我的母语,我试着尽我所能写出来,如果它有任何拼写错误我道歉。
答案 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: []