我写了一个片段,但它没有正常工作。
我有这种格式的输入:
Arg2+res=(s11_19,s11_20,s11_21,s11_22),Arg4-res=()
它可以包含多个Args(例如Arg1,Arg2,......)。
我想要的是返回+res
个实例。例如,在上面的例子中,我需要这个部分:
Arg2+res=(s11_19,s11_20,s11_21,s11_22)
我的正则表达式如下:
Pattern p = Pattern.compile("Arg\\d+\\+res=\\(\\S+\\)");
Matcher m = p.matcher(ove_imp_roles);
while (m.find()) {
System.out.println(m.group());
}
代码有两个问题:
1)它将整个字符串作为单个匹配返回。例如,在上面的句子中,它返回Arg2+res=(s11_19,s11_20,s11_21,s11_22),Arg4-res=()
作为匹配实例。
即使两个实例都包含Arg1+res
,它也会将整个字符串作为单个匹配返回,而我希望它将作为两个不同的匹配返回。
2)代码也使用-res
计算实例,而我不需要它们。
任何人都可以帮我解决这个问题吗?
更新:我再次检查了代码,并相应地更新了上述问题。 -res
包含空括号时会出现问题(例如Arg1-res=()
。
提前致谢,
答案 0 :(得分:3)
您在m.find()
内呼叫while(m.find())
,请按照以下方式调用:
Pattern p = Pattern.compile("Arg\\d+\\+res=\\(\\S+\\)");
Matcher m = p.matcher(ove_imp_roles);
while (m.find()) {
System.out.println(m.group());
}
btw your regex is matching 2nd Arg
correctly
基于已编辑的问题和新输入OP可以使用此正则表达式:
Pattern p = Pattern.compile("Arg\\d+\\+res=\\([^)]+\\)");
[^)]+
将匹配1个或更多不是)
的字符。
答案 1 :(得分:1)
问题是(\\S+\\)
。如果您有以下输入:
String s = "Arg2+res=(s1355_19,s1355_20);Arg3-res=(s1355_19,s1355_20)";
Arg\\d+\\+res=\\(
匹配Arg2+res=(
,然后S+
将匹配(因为+
贪婪):
s1355_19,s1355_20);Arg3-res=(s1355_19,s1355_20
所以你可以让它变得懒惰,以便它在输入中找到第一个右括号后立即停止:
Pattern p = Pattern.compile("Arg\\d+\\+res=\\(\\S+?\\)");
或者,您可以按';'
拆分输入,看看每个字符串是否匹配"^Arg\\d+\\+.*$"