解析多行字符
有的時候我們需要在文本中解析,這個時候需要解決匹配多次和換行的問題,通過一個例子來看看吧。
憤怒的小鳥
我們看一下憤怒的小鳥里面的人物介紹:
【紅色小鳥】(紅火)
體型小,重量輕,攻擊弱,無特效,可在滾動時消滅綠豬。適合攻擊玻璃與木頭,攻擊混凝土較弱。(關卡1-1)
【藍色小鳥】(藍冰)
體型極小,重量輕,攻擊弱,可以變成3個。攻擊玻璃較強,攻擊木頭與混凝土較弱。(關卡1-10)
【黃色小鳥】(黃風)
體型較小,重量較輕,特效為加速,使用前攻擊弱,使用后攻擊中等。攻擊木頭較強,攻擊玻璃與混凝土很弱。(關卡1-16)
【黑色小鳥】(黑炮)
體型較大,重量重,會爆炸,撞擊力強,爆炸力弱,氣浪強。適合攻擊混凝土。(關卡2-5)
【白色小鳥】(白彈)
體型大,重量重,可以向下方下一個“炸蛋”,同時白鳥變小且被彈開。撞擊力弱,“炸蛋”爆炸力大,氣浪低,不適合攻擊所有材料(“炸蛋”碰到任何物體都會立刻爆炸,除了碰到自己的小鳥或彈簧會彈開以外,都會立刻爆炸,彈開時撞擊力較強,可對對方造成中等傷害?。?。直接用身體適合攻擊木板和玻璃。(關卡2-14)
【綠色小鳥】(綠顏)
體型中等,重量較輕,嘴大,可以回旋,使用特效前攻擊弱,使用后攻擊中等。適合攻擊玻璃與木頭,攻擊混凝土較弱。(關卡6-5、關卡9-6)
【紅色大鳥】(虹羽)
外形為紅色小鳥的放大版,體型大,重量中等,無特效,攻擊力極強,撞擊地面時有彈性,彈起后碰到物體傷害力中等。(關卡9-1)
【橙色小鳥】(氣騰)
攻擊力中等,點擊后會膨脹以彈開開附近的磚塊。(關卡18-1)
【粉色小鳥】(粉黛)
攻擊力低,點擊后會把周圍的東西弄上泡泡,使其向上移動。
我們的目標是
- 找到所有小鳥的名字,也就是包含‘小鳥‘且在中括號中的鳥名字。
- 前后沒有其他字符
實戰(zhàn)
先寫一段測試程序吧:
str.match(/小鳥/);
只能返回一個匹配
var str =
'【紅色小鳥】\n【藍色小鳥】(藍冰)\n【黃色小鳥】(黃風)\n【黑色小鳥】\n【白色小鳥】(白彈)\n【綠色小鳥】(綠顏)\n【紅色大鳥】(虹羽) \n【橙色小鳥】(氣騰)\n【粉色小鳥】(粉黛)';
str.match(/小鳥/);//返回["小鳥"]
我們加上修飾符g
str.match(/小鳥/g);
返回了["小鳥", "小鳥", "小鳥", "小鳥", "小鳥", "小鳥", "小鳥", "小鳥", "小鳥", "小鳥"]
。還不錯,但是我們要的是鳥名字。
加上名字,需要匹配漢子和【】
漢子的字符一般在[\u4e00-\u9fa5]。
str.match(/【[\u4e00-\u9fa5]+小鳥】/g);
返回["【紅色小鳥】", "【藍色小鳥】", "【黃色小鳥】", "【黑色小鳥】", "【白色小鳥】", "【綠色小鳥】", "【橙色小鳥】", "【粉色小鳥】"]
好像還不錯,但是我們需要前后沒有其他字符的小鳥名字。
加上^
,$
str.match(/^【[\u4e00-\u9fa5]+小鳥】$/g);
這下返回null了
加上m
上面之所以返回null,是因為^$
的作用加在了整個字符串的上面,也就是驗證'【紅色小鳥】\n【藍色小鳥】(藍冰)\n【黃色小鳥】(黃風)\n【黑色小鳥】(黑炮)\n【白色小鳥】(白彈)\n【綠色小鳥】(綠顏)\n【紅色大鳥】(虹羽) \n【橙色小鳥】(氣騰)\n【粉色小鳥】(粉黛)'
整個字符串是否符合模式,顯然是不符合的,我們希望對每一行進行匹配,m
就是干這個的。
修飾符 | 描述 |
---|---|
i | 執(zhí)行對大小寫不敏感的匹配。 |
g | 執(zhí)行全局匹配(查找所有匹配而非在找到第一個匹配后停止)。 |
m | 執(zhí)行多行匹配。 |
str.match(/^【[\u4e00-\u9fa5]+小鳥】$/gm);
這下只返回了["【紅色小鳥】", "【黑色小鳥】"]
,只有這兩個是沒有外號,前后都沒有字符的,符合我們的要求。