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
网友评论