在正常工作时,正则表达式不能使用Java

时间:2017-07-05 12:58:37

标签: java regex intellij-idea

我做了一个正则表达式: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;

enter image description here

我错过了什么?如何转换正则表达式以使其在Java中工作?

2 个答案:

答案 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}}无处不在
  • *不是正则表达式元字符,所以它不需要转义