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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • //定义正则表达式的两种方式,在用构造函数的时候,有些地方是要加转义字符的。 //1、字面量。 var reg =...
    xiaobing0324阅读 3,405评论 0 0
  • Python中的正则表达式(re) import rere.match #从开始位置开始匹配,如果开头没有则无re...
    BigJeffWang阅读 12,102评论 0 99
  • 前言 作为一个程序员,要出去装逼,手中必备的技能就是正则表达式。程序员的正则表达式,医生的处方和道士的鬼画符,都是...
    Layzimo阅读 3,649评论 0 6
  • 1. 验证正则表达式中的全局g对几种方法的影响 test校验方法:正则的方法总结:1)不添加全局g时,lastIn...
    果木山阅读 2,578评论 0 0
  • 1.1 正则基础 正则的含义:由特定的符号组成的具有特殊含义的代码; 正则的目的:就是制定一些规则,来操作(校验/...
    果木山阅读 728评论 0 0