我做了一个正则表达式:https://regex101.com/r/ToCwrE/2/
它应该做的就是获取函数的参数。我正在尝试使用捕获组来实现此目的。
[\s]*javascript:[\s]*m\((-?\d+)[\s]*,[\s]*(-?\d+)[\s]*,[\s]{0,}encodeURIComponent\(\'([^\']+)*\'\)[\s]*,[\s]*(-?\d+)\)[\s]*
尝试过:
javascript:m(53009,2,encodeURIComponent('7711T'), 22)
javascript:m(52992,2,encodeURIComponent('3013'), 2)
javascript:m(10440,2,encodeURIComponent('F Series'), 11)
javascript:m(53022,2,encodeURIComponent('C 12045'), 85)
javascript:m(53045,2,encodeURIComponent('Prox 8441'), 16)
javascript:m(26016,2,encodeURIComponent('Vard asd .ious'), 22)
使用网站regex101和一些类似的网站,它正确返回匹配的组。但是,当我尝试在Java中使用它时,它只是不匹配捕获组,只返回整个文本。
如果我使用IDEA复制粘贴它,它会自动转义(替换为\):
Pattern pattern = Pattern.compile("[\\s]*javascript:[\\s]*m\\((-?\\d+)[\\s]*,[\\s]*(-?\\d+)[\\s]*,[\\s]{0,}encodeURIComponent\\(\\'([^\\']+)*\\'\\)[\\s]*,[\\s]*(-?\\d+)\\)[\\s]*");
Matcher m = pattern.matcher("javascript:m(53022,2,encodeURIComponent('Cr 12045'), 85)");
List<String> groups = new ArrayList<>();
while (m.find()) {
groups.add(m.group());
}
groups;
我错过了什么?如何转换正则表达式以使其在Java中工作?
答案 0 :(得分:2)
正则表达式匹配正确,它就是你使用m.group()引用每个组的方式。以下内容应该有所帮助:
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaTest {
public static void main(String[] args) {
Pattern pattern = Pattern.compile("[\\s]*javascript:[\\s]*m\\((-?\\d+)[\\s]*,[\\s]*(-?\\d+)[\\s]*,[\\s]{0,}encodeURIComponent\\(\\'([^\\']+)*\\'\\)[\\s]*,[\\s]*(-?\\d+)\\)[\\s]*");
Matcher m = pattern.matcher("javascript:m(53009,2,encodeURIComponent('7711T'), 22)");
if (m.find()) {
for (int i=1 ; i <= m.groupCount() ; i++) {
System.out.println(m.group(i));
}
}
}
}
提供输出:
53009
2
7711T
22
答案 1 :(得分:2)
要获取每个群组的内容,您可以使用Matcher#group(number)
或Matcher#group(name)
。在您的情况下,要获取第一组的内容m.group(1)
,您将获得53022
。
m.group()
的问题在于它与m.group(0)
相同,因此它返回组0的内容,它保持整个模式的匹配。
迭代所有组使用简单的for循环。要在模式使用Matcher#groupCount
中动态获取组的数量。
所以要把所有组的结果都用到
Pattern p = Pattern.compile("[\\s]*javascript:[\\s]*m\\((-?\\d+)[\\s]*,[\\s]*(-?\\d+)[\\s]*,[\\s]{0,}encodeURIComponent\\(\\'([^\\']+)*\\'\\)[\\s]*,[\\s]*(-?\\d+)\\)[\\s]*");
Matcher m = p.matcher("javascript:m(53022,2,encodeURIComponent('Cr 12045'), 85)");
List<String> groups = new ArrayList<>();
while (m.find()) {
for (int i=1; i<=m.groupCount(); i++){
groups.add(m.group(i));
}
}
System.out.println(groups); //[53022, 2, Cr 12045, 85]
BTW
\s
已经是字符类,因此不需要嵌套在[..]
中,因此您可以编写[\\s]*
代替\\s*
。 {0,}
与*
相同,所以我认为没有理由将这两者混合使用{/ 1}}无处不在*
不是正则表达式元字符,所以它不需要转义