JS扼雏、Python南捂、Java中正則表達(dá)式全局匹配功能對(duì)比

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末上枕,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子弱恒,更是在濱河造成了極大的恐慌辨萍,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件返弹,死亡現(xiàn)場(chǎng)離奇詭異锈玉,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)义起,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門拉背,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人默终,你說(shuō)我怎么就攤上這事椅棺。” “怎么了齐蔽?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵两疚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我含滴,道長(zhǎng)诱渤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任谈况,我火速辦了婚禮源哩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸦做。我一直安慰自己励烦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布泼诱。 她就那樣靜靜地躺著坛掠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屉栓,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天舷蒲,我揣著相機(jī)與錄音,去河邊找鬼友多。 笑死牲平,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的域滥。 我是一名探鬼主播纵柿,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼启绰!你這毒婦竟也來(lái)了昂儒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤委可,失蹤者是張志新(化名)和其女友劉穎渊跋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體着倾,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拾酝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卡者。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片微宝。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖虎眨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情镶摘,我是刑警寧澤嗽桩,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站凄敢,受9級(jí)特大地震影響碌冶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涝缝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一扑庞、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拒逮,春花似錦罐氨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春租悄,著一層夾襖步出監(jiān)牢的瞬間谨究,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工泣棋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胶哲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓潭辈,卻偏偏與公主長(zhǎng)得像鸯屿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萎胰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • //定義正則表達(dá)式的兩種方式碾盟,在用構(gòu)造函數(shù)的時(shí)候,有些地方是要加轉(zhuǎn)義字符的技竟。 //1冰肴、字面量。 var reg =...
    xiaobing0324閱讀 488評(píng)論 0 0
  • Python中的正則表達(dá)式(re) import rere.match #從開始位置開始匹配榔组,如果開頭沒有則無(wú)re...
    BigJeffWang閱讀 7,053評(píng)論 0 99
  • 前言 作為一個(gè)程序員熙尉,要出去裝逼,手中必備的技能就是正則表達(dá)式搓扯。程序員的正則表達(dá)式检痰,醫(yī)生的處方和道士的鬼畫符,都是...
    Layzimo閱讀 534評(píng)論 0 6
  • 1. 驗(yàn)證正則表達(dá)式中的全局g對(duì)幾種方法的影響 test校驗(yàn)方法:正則的方法總結(jié):1)不添加全局g時(shí)锨推,lastIn...
    果木山閱讀 315評(píng)論 0 0
  • 1.1 正則基礎(chǔ) 正則的含義:由特定的符號(hào)組成的具有特殊含義的代碼铅歼; 正則的目的:就是制定一些規(guī)則,來(lái)操作(校驗(yàn)/...
    果木山閱讀 92評(píng)論 0 0