解析多行字符
有的时候我们需要在文本中解析,这个时候需要解决匹配多次和换行的问题,通过一个例子来看看吧。
愤怒的小鸟
我们看一下愤怒的小鸟里面的人物介绍:
【红色小鸟】(红火)
体型小,重量轻,攻击弱,无特效,可在滚动时消灭绿猪。适合攻击玻璃与木头,攻击混凝土较弱。(关卡1-1)
【蓝色小鸟】(蓝冰)
体型极小,重量轻,攻击弱,可以变成3个。攻击玻璃较强,攻击木头与混凝土较弱。(关卡1-10)
【黄色小鸟】(黄风)
体型较小,重量较轻,特效为加速,使用前攻击弱,使用后攻击中等。攻击木头较强,攻击玻璃与混凝土很弱。(关卡1-16)
【黑色小鸟】(黑炮)
体型较大,重量重,会爆炸,撞击力强,爆炸力弱,气浪强。适合攻击混凝土。(关卡2-5)
【白色小鸟】(白弹)
体型大,重量重,可以向下方下一个“炸蛋”,同时白鸟变小且被弹开。撞击力弱,“炸蛋”爆炸力大,气浪低,不适合攻击所有材料(“炸蛋”碰到任何物体都会立刻爆炸,除了碰到自己的小鸟或弹簧会弹开以外,都会立刻爆炸,弹开时撞击力较强,可对对方造成中等伤害!)。直接用身体适合攻击木板和玻璃。(关卡2-14)
【绿色小鸟】(绿颜)
体型中等,重量较轻,嘴大,可以回旋,使用特效前攻击弱,使用后攻击中等。适合攻击玻璃与木头,攻击混凝土较弱。(关卡6-5、关卡9-6)
【红色大鸟】(虹羽)
外形为红色小鸟的放大版,体型大,重量中等,无特效,攻击力极强,撞击地面时有弹性,弹起后碰到物体伤害力中等。(关卡9-1)
【橙色小鸟】(气腾)
攻击力中等,点击后会膨胀以弹开开附近的砖块。(关卡18-1)
【粉色小鸟】(粉黛)
攻击力低,点击后会把周围的东西弄上泡泡,使其向上移动。
我们的目标是
- 找到所有小鸟的名字,也就是包含‘小鸟‘且在中括号中的鸟名字。
- 前后没有其他字符
实战
先写一段测试程序吧:
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 | 执行对大小写不敏感的匹配。 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。 |
m | 执行多行匹配。 |
str.match(/^【[\u4e00-\u9fa5]+小鸟】$/gm);
这下只返回了["【红色小鸟】", "【黑色小鸟】"]
,只有这两个是没有外号,前后都没有字符的,符合我们的要求。