正则表达式5-分组突击

每一个小鸟都很愤怒,因为我们还不会分组作战

我们还是用小鸟们做例子,来学会使用分组

var str = 
'【红色小鸟】(红火)体型小,重量轻,攻击弱,无特效,可在滚动时消灭绿猪。适合攻击玻璃与木头,攻击混凝土较弱。(关卡1-1)\n【蓝色小鸟】(蓝冰)体型极小,重量轻,攻击弱,可以变成3个。攻击玻璃较强,攻击木头与混凝土较弱。(关卡1-10)';
str.match(/^(【[\u4e00-\u9fa5]+】)(([\u4e00-\u9fa5]+))([\u4e00-\u9fa50-9,。]+)([\u4e00-\u9fa5]+(\d+\-\d+))$/gm);
str.split(/^(【[\u4e00-\u9fa5]+】)(([\u4e00-\u9fa5]+))([\u4e00-\u9fa50-9,。]+)([\u4e00-\u9fa5]+(\d+\-\d+))$/gm);


我们希望把格式变成

"【红色小鸟】的外号是(红火),出现在关卡1-1\n【蓝色小鸟】的外号是(蓝冰),出现在关卡1-10"

分析字符串

  1. 需要进行多行全局搜索,前后需要无字符,所以要用上gm^$
  2. 需要取出名字,【[\u4e00-\u9fa5]+】
  3. 需要拿到外号,([\u4e00-\u9fa5]+)
  4. 需要拿到能力,[\u4e00-\u9fa50-9,。]+
  5. 需要拿到关卡,[\u4e00-\u9fa5]+(\d+-\d+)
    把以上拼接在一起就是
/^(【[\u4e00-\u9fa5]+】)(([\u4e00-\u9fa5]+))([\u4e00-\u9fa50-9,。]+)([\u4e00-\u9fa5]+(\d+\-\d+))$/gm

分组能干嘛呢

我们知道()是用来分组的,可是分组有什么用呢。上面分别给2,3,4,5步的正则都加上了()。我们可以在string的replace函数中使用分组。看一下这个代码。

str.replace(/^(【[\u4e00-\u9fa5]+】)(([\u4e00-\u9fa5]+))([\u4e00-\u9fa50-9,。]+)([\u4e00-\u9fa5]+(\d+\-\d+))$/gm, "$1的外号是$2,出现在关卡$4");

这样我们的目的已经达到了,输出了"【红色小鸟】的外号是(红火),出现在关卡1-1\n【蓝色小鸟】的外号是(蓝冰),出现在关卡1-10"

不捕获的分组

我们可以注意到上面使用$4引用到了关卡,如何使用$3就引用到呢?

str.replace(/^(【[\u4e00-\u9fa5]+】)(([\u4e00-\u9fa5]+))(?:[\u4e00-\u9fa50-9,。]+)([\u4e00-\u9fa5]+(\d+\-\d+))$/gm, "$1的外号是$2,出现在关卡$3");

?:表示不捕获的分组,我们在能力分组上(?:[\u4e00-\u9fa50-9,。]+)加上了不捕获的标志。

好用的工具

一旦正则表达式复杂起来,很难看懂,这时候利用一些工具则非常有用

http://www.regexr.com/

上面这个网站可以用来分析正则表达式。有高亮的功能哦。可惜对中文支持的不是很好。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 正则表达式到底是什么东西?字符是计算机软件处理文字时最基本的单位,可能是字母,数字,标点符号,空格,换行符,汉字等...
    狮子挽歌阅读 6,476评论 0 9
  • iOS中使用正则表达式就不得不提NSRegularExpression,所以我们需要先搞清楚什么是NSRegula...
    sunmumu1222阅读 6,944评论 0 4
  • 初衷:看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印...
    DCbryant阅读 9,503评论 0 20
  • tags: 正则表达式categories: JavaScript欢迎点击我的博客原文 前端会遇到很多字符串验证问...
    浅茉Sara阅读 4,134评论 1 2
  • 梦里我踩碎了眼镜 哭湿了枕头 今天怎么有那么多婚礼 现在你在干什么呢 我要不要买点啤酒继续睡过去 十一点半 时隔好...
    爱发牢骚的上进青年阅读 955评论 0 0