美文网首页
JS、Python、Java中正则表达式全局匹配功能对比

JS、Python、Java中正则表达式全局匹配功能对比

作者: Arckle | 来源:发表于2018-09-17 15:11 被阅读0次

    JS:

    var regStr = "(\\w+),?";
    var str = "aabb,xxx,yysin,ienif";
    toIterateGroup = function(regStr, str){
        let reg = new RegExp(regStr, "g");
        let result = reg.exec(str);
        while(result !== null){
            console.log(result[0]);//匹配结果
            if(result.length > 1){
                for(let i = 1; i < result.length; ++i){
                    console.log(result[i]);//匹配结果中捕获结果
                }
            }
        result = reg.exec(str);
        }
    }
    
    toIterateGroup(regStr, str);
    

    上式中reg.exec(str)的结果为["aabb,", "aabb", "index":0, input:"aabb,xxx,yysin,ienif", groups:undefined]
    结果数组部分:
    第0项"aabb,"为(\w+),?表达式的匹配结果;
    第1项"aabb"为表达式中第一个捕获项(\w+)的捕获结果;
    以此类推,第n项为第n个捕获项的捕获结果;
    结果属性部分:
    index为匹配结果首字母在目标字符串中的索引位置;
    input为目标字符串;

    其中由于reg设置了flag为"g",意为全局匹配,则每一次执行reg.exec(str)都会前进到下一个匹配项,直到没有匹配项(没有匹配项的执行结果为null,可以以此为循环的终止条件)。
    正则对象reg中的属性lastIndex,为每次匹配结果的末位字符在目标字符串中的索引位置index+1的值,也就是下一个字符的index(即下次匹配的起始index);

    注意:如果没有设置全局匹配的flag,则每次执行reg.exec(str)都为第一个匹配结果,且str.match(reg)和reg.exec(str)的结果一致。如果有设置全局匹配的flag,那么str.match(reg)返回一个按顺序包含全部匹配结果的字符串数组。

    Python:

    import re
    reg = r"(\w+),?"
    str = "aabb,xxx,yysin,ienif"
    re.findall(reg, str, re.I)
    

    python中的re.findall(pattern, str, flags)函数是JS当中的match和exec函数的综合。
    findall的返回结果是全部匹配项的数组(findall函数本身就是全局匹配的意思);如果pattern中有捕获项,则返回的数组中,每个元素都是按顺序捕获的字符串所组成的元组(类似二维数组,只不过数组内的数组被元组所替代)。
    re.finditer(pattern, str, flags)与findall函数功能类似,但是返回的是包含匹配结果和捕获结果的对象组成的数组。需按如下方式遍历:

    reg = r"(\w+),?"
    str = "aabb,xxx,yysin,ienif"
    matchResult = re.finditer(reg, str, re.I)
    for result in matchResult:
        result.group()#匹配结果
        result.groups()#匹配结果当中,捕获结果依次组成的元组对象
        if len(result.groups()) > 0:
            for g in result.groups():
                print(g)
    

    Java:

    String reg = "(\\w+),?";
    String str = "aabb,xxx,yysin,ienif";
    Pattern pattern = Pattern.compile(reg);//编译正则表达式(\w+),?
    Matcher matcher = pattern.matcher(str);//用编译后的pattern去匹配目标字符串str
    while(matcher.find()){//从开头逐个匹配,返回值为”是否发现匹配项“
        matcher.group();//当前匹配结果
        matcher.start();//当前匹配结果首字符在目标字符串中的索引位置index
        matcher.end();//当前匹配结果末位字符在目标字符串中的索引位置index+1
        matcher.groupCount();//正则表达式中捕获项个数
        if(matcher.groupCount() > 0){
            for(int i = 1; i <= matcher.groupCount(); ++i){
                matcher.group(i);//当前匹配结果中第i个捕获结果,i:1, 2, 3…
            }
        }
    }
    

    综上所述:
    Java的正则表达式应用虽然较为繁琐,但是所要获得的内容都比较清晰。
    js的exec函数的匹配结果,可读性较差,需要做专门说明,但是使用起来较为简单。
    python的findall函数使用方便,但是当含有捕获项时,所得未必为期望的结果;而finditer函数所得结果为Match对象的迭代器,与java的结果较为相似,对应操作也类似。

    如有错漏,欢迎留言讨论:D

    相关文章

      网友评论

          本文标题:JS、Python、Java中正则表达式全局匹配功能对比

          本文链接:https://www.haomeiwen.com/subject/lxgknftx.html