正则表达式4-多行的诗歌

2016-03-02  本文已影响75人  转角遇见一直熊

解析多行字符

有的时候我们需要在文本中解析,这个时候需要解决匹配多次和换行的问题,通过一个例子来看看吧。

愤怒的小鸟

我们看一下愤怒的小鸟里面的人物介绍:

【红色小鸟】(红火)
体型小,重量轻,攻击弱,无特效,可在滚动时消灭绿猪。适合攻击玻璃与木头,攻击混凝土较弱。(关卡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);

这下只返回了["【红色小鸟】", "【黑色小鸟】"],只有这两个是没有外号,前后都没有字符的,符合我们的要求。

上一篇 下一篇

猜你喜欢

热点阅读