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

解析多行字符

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

愤怒的小鸟

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

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

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

我的微信号

转载于:https://www.cnblogs.com/xiaohu1986/p/5233995.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值