如何在正则表达式中使用加号
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+\+.*$"
我写了一个片段,但它不能正常工作。
我有一个这种格式的输入:
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+\+.*$"