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

How to use plus character in regex

我写了一个片段,但它不能正常工作。

我有一个这种格式的输入:

Arg2+res=(s11_19,s11_20,s11_21,s11_22),Arg4-res=()

它可以包含多个 Args(例如 Arg1、Arg2、...)。 我想要的是 return +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) 它return将整个字符串作为一个匹配项。比如上面这句话中它returns Arg2+res=(s11_19,s11_20,s11_21,s11_22),Arg4-res=()作为匹配实例。

即使两个实例都包含 Arg1+res,它 return 将整个字符串作为一个匹配项,而我希望它 return 作为两个不同的匹配项。

2) 代码也计算 -res 的实例,但我不需要它们。

谁能帮我解决这个问题?

更新:我再次检查了代码,并相应更新了上面的问题。 -res 包含空括号时会出现问题(例如 Arg1-res=().

提前致谢,

你在 while(m.find()) 中调用 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 个或多个不是 ).

的字符

问题是(\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+\+.*$"