如何在正则表达式中使用加号

时间:2015-05-26 14:15:48

标签: java regex special-characters

我写了一个片段,但它没有正常工作。

我有这种格式的输入:

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=()

提前致谢,

2 个答案:

答案 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+\\+.*$"