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]);//匹配結(jié)果
if(result.length > 1){
for(let i = 1; i < result.length; ++i){
console.log(result[i]);//匹配結(jié)果中捕獲結(jié)果
}
}
result = reg.exec(str);
}
}
toIterateGroup(regStr, str);
上式中reg.exec(str)的結(jié)果為["aabb,", "aabb", "index":0, input:"aabb,xxx,yysin,ienif", groups:undefined]
結(jié)果數(shù)組部分:
第0項(xiàng)"aabb,"為(\w+),?表達(dá)式的匹配結(jié)果攒砖;
第1項(xiàng)"aabb"為表達(dá)式中第一個(gè)捕獲項(xiàng)(\w+)的捕獲結(jié)果缸兔;
以此類推,第n項(xiàng)為第n個(gè)捕獲項(xiàng)的捕獲結(jié)果吹艇;
結(jié)果屬性部分:
index為匹配結(jié)果首字母在目標(biāo)字符串中的索引位置惰蜜;
input為目標(biāo)字符串;
其中由于reg設(shè)置了flag為"g"受神,意為全局匹配蝎抽,則每一次執(zhí)行reg.exec(str)都會(huì)前進(jìn)到下一個(gè)匹配項(xiàng),直到?jīng)]有匹配項(xiàng)(沒有匹配項(xiàng)的執(zhí)行結(jié)果為null路克,可以以此為循環(huán)的終止條件)。
正則對(duì)象reg中的屬性lastIndex养交,為每次匹配結(jié)果的末位字符在目標(biāo)字符串中的索引位置index+1的值精算,也就是下一個(gè)字符的index(即下次匹配的起始index);
注意:如果沒有設(shè)置全局匹配的flag碎连,則每次執(zhí)行reg.exec(str)都為第一個(gè)匹配結(jié)果灰羽,且str.match(reg)和reg.exec(str)的結(jié)果一致。如果有設(shè)置全局匹配的flag鱼辙,那么str.match(reg)返回一個(gè)按順序包含全部匹配結(jié)果的字符串?dāng)?shù)組廉嚼。
Python:
import re
reg = r"(\w+),?"
str = "aabb,xxx,yysin,ienif"
re.findall(reg, str, re.I)
python中的re.findall(pattern, str, flags)函數(shù)是JS當(dāng)中的match和exec函數(shù)的綜合。
findall的返回結(jié)果是全部匹配項(xiàng)的數(shù)組(findall函數(shù)本身就是全局匹配的意思)倒戏;如果pattern中有捕獲項(xiàng)怠噪,則返回的數(shù)組中,每個(gè)元素都是按順序捕獲的字符串所組成的元組(類似二維數(shù)組杜跷,只不過(guò)數(shù)組內(nèi)的數(shù)組被元組所替代)傍念。
re.finditer(pattern, str, flags)與findall函數(shù)功能類似,但是返回的是包含匹配結(jié)果和捕獲結(jié)果的對(duì)象組成的數(shù)組葛闷。需按如下方式遍歷:
reg = r"(\w+),?"
str = "aabb,xxx,yysin,ienif"
matchResult = re.finditer(reg, str, re.I)
for result in matchResult:
result.group()#匹配結(jié)果
result.groups()#匹配結(jié)果當(dāng)中憋槐,捕獲結(jié)果依次組成的元組對(duì)象
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);//編譯正則表達(dá)式(\w+),?
Matcher matcher = pattern.matcher(str);//用編譯后的pattern去匹配目標(biāo)字符串str
while(matcher.find()){//從開頭逐個(gè)匹配,返回值為”是否發(fā)現(xiàn)匹配項(xiàng)“
matcher.group();//當(dāng)前匹配結(jié)果
matcher.start();//當(dāng)前匹配結(jié)果首字符在目標(biāo)字符串中的索引位置index
matcher.end();//當(dāng)前匹配結(jié)果末位字符在目標(biāo)字符串中的索引位置index+1
matcher.groupCount();//正則表達(dá)式中捕獲項(xiàng)個(gè)數(shù)
if(matcher.groupCount() > 0){
for(int i = 1; i <= matcher.groupCount(); ++i){
matcher.group(i);//當(dāng)前匹配結(jié)果中第i個(gè)捕獲結(jié)果淑趾,i:1, 2, 3…
}
}
}
綜上所述:
Java的正則表達(dá)式應(yīng)用雖然較為繁瑣阳仔,但是所要獲得的內(nèi)容都比較清晰。
js的exec函數(shù)的匹配結(jié)果扣泊,可讀性較差近范,需要做專門說(shuō)明嘶摊,但是使用起來(lái)較為簡(jiǎn)單。
python的findall函數(shù)使用方便顺又,但是當(dāng)含有捕獲項(xiàng)時(shí)更卒,所得未必為期望的結(jié)果;而finditer函數(shù)所得結(jié)果為Match對(duì)象的迭代器稚照,與java的結(jié)果較為相似蹂空,對(duì)應(yīng)操作也類似。
如有錯(cuò)漏果录,歡迎留言討論:D