相距 FCC 西安第一次线下编程活动,从 2016 年 09 月 16 日到 2017 年 03 月 12 日,半年的时间,在这个社区,发生了很多很多难忘的故事。身为小小组织者的我,也将很多成长中的“第一次”挥洒到了这里。FCC 西安,伴随每一位开发者茁壮成长。
不是我们跟奇数过不去,反而恰巧,在第一、三、五次,活动办得最有意思也最具干货。就不细细讲来其中的缘由。
这次,FCC 西安进高校,西安邮电大学一个新开的,很棒的大学生创业咖啡馆里,分享编程人♀生。
1
Icebreaker Games。次次活动都轮流介绍一下自己是不是不清真?能创新,就有不一样的体验。这次分为三个小组,每个人代表自己小组来说出自己的三个爱好或特长,其中一个是假的,其余小组抢答说爱好的人的哪个爱好是假的,答对加一分,答错扣一分。分数最低的小组呢,再来介绍一下自己的家乡和美食馋馋大家。命运,掌握在自己的手上。
每个人的爱好都各有所长,假的那个爱好反而更有趣和调皮。就说说我说的三个真假爱好吧,看看你能猜出来吗?
- 喜欢读书、编程、游戏和写作。
- 苦瓜真好吃。
- 熟悉前端和后台。
答案,最后揭晓。
2
不知道各位 FCC 学员曾经、现在所在的大学与开源社区的合作活跃度怎么样。只要有一双善于发现的眼睛,我相信在工科学校内,都会找到一俩个和开源社区有合作的大学生团体吧?
我们的西邮(选址原因罢,这次参加活动的大部分是西邮学生),就与下图的开源社区有过长期合作,其中,FCC 中文社区,便是我带进来的。祈愿长传。
3
FCC 的介绍每一位 FCC 学员在自己的城市线下活动中相信听过很多次了。这次,切入一个主题,浅谈 FCC 的 MEAN 架构。自己学历尚浅,参考资料外加个人感悟而诉。
MEAN = MongoDB + Express + Angular + Node.js
从上述单词缩写的示意可以看到, MEAN 架构作为全 Javascript 的 Web 开发架构,能够端到端地开发现代的、全堆栈的二十一世纪 Web 项目,有如下特点:
- (M)ongoDB——采用 NoSQL 的文档数据库,使用 JSON 风格来存储数据,甚至也是使用 JS 来进行 sql 查询;
- (E)xpress——基于Node的Web开发框架,提供对服务端路由的访问;
- (A)agular——JS的前端开发框架,提供了声明式的双向数据绑定;
- (N)ode——基于V8的运行时环境(JS语言开发),可以构建快速响应、可扩展的网络应用。
再对比 LAMP 技术堆栈,详细内容可以独立成章,这里便不细细而谈。
4
干货,绝对的干货。JavaScript 之正则表达式入门。以下内容参考自慕课网的 JS 正则表达式。
^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$
以前,总觉得正则表达式太高端,像汇编语言一样羞涩难懂。看到上面的这串正则,我知道肯定有规则可寻,但只能看懂个 a-z 什么的。好了,不鸡汤了,上更多的干货。
身为开发者,我们一直在默默使用着正则。git add .
这种最让我们偷懒的 git 命令一直在使用着。如果你还没用过,FCC 可以带给你这些知识点。
JavaScript 中通过内置对象 RegExg 支持正则表达式。字符串对象 String 也有相应的正则方法。
先用常见的 string.split(',')
为例,在 FCC 上做过题的学员肯定十分熟悉这条语句,其实,string.split(',')
中的 , 会被转做正则,效果等价于 string.split(/,/g);
,意为在全局寻找 ,
并将逗号前后的字符串分别顺序放入数组中。
回到 RegExg 对象中,有两种方法实例化 RegExp 对象:字面量和构造函数。
在下图示例中,第二条语句 var reg = /\bis\b/g
用字面量的方式声明了一条正则表达式规则,该规则将在全局(g, global)中匹配所有单独存在的 is 单词。第三条语句进行匹配。看看第四条语句,var reg = new RegExp('\bb\is\\b', 'g')
,实例化一个 RegExp 对象并传入相关参数触发构造函数,第一个参数便是正则表达式,第二个代表该规则将在全局(g, global)中匹配。
可以看到,字面量中,用 // 包裹正则表达式语句,RegExp 对象里,由于是 JS 语句,反斜线 ```本身并不代表反斜线而是转义的意思,应该将反斜线用自身转义,
\才代表一个反斜线,
\t``` 代表一个制表符,俗称缩进。如下转义常见的字符不止能在 JavaScript 中见到。
转义字符 | 含义 |
---|---|
\t | 水平制表符 |
\v | 垂直制表符 |
\n | 换行符 |
\r | 回车符 |
\0 | 空字符 |
\f | 换页符 |
\cX | 与 X 对应的控制字符(Ctrl + X) |
元字符
正则表达式由两种基本字符类型组成:原意文本字符和元字符。原意文本字符很好理解,在正则表达式中,a
就是要找到 a
字母,但若是看到 [a-z]
那肯定不是匹配 [a-z]
这五个连续的字符了,意思是把 a 字母到 z 字母中所有字母组成一类,只要能匹配到这一类的任意一个就满足匹配规则。[
、]
便是元字符。
在正则表达式中有特殊含义的非字母字符有,+
、?
、$
、^
、.
、|
、\
、(
、)
、{
、}
、[
、]
。如果就想用这些元字符本身的意思,$
就是代表美元符,转义即可:\$
字符类
刚刚提到,“在正则表达式中出现的 [a-z]
是把 a 字母到 z 字母中所有字母组成一类,只要能匹配到这一类的任意一个就满足匹配规则。”,就用到了字符类。一般情况下,正则表达式的一个字符对应字符串的一个字符,而用 []
来构建一个简单的类。^
来创建一个反向类。
怎么理解呢?以下两行代码中,第一行将字符串中所有 a
、b
、c
的字符替换成 X
字符。而第二行则代表将字符串中所有不是 a
、b
、c
的字符替换成 X
,后者便是反向类。
'a1b2c3d4'.replace(/[abc]/g, 'X');
'a1b2c3d4'.replace(/[^abc]/g, 'X');
预定义类
到了这里,[0-9]
便能轻松看懂了。但想要写一个匹配 11 位电话号码的规则,难道连写十一次吗?当然不是,\d
便等价于 [0123456789]
,d 即代表着 digit。
\d\d\d\d\d\d\d\d\d\d\d
总比[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]
要好。
常见的其他预定义类还有很多: \D
等价于 [^0-9]
,刚才提到,这是反向类,用来匹配所有非数字字符。\s
等价于 [\t\n\x0B\f\r]
匹配空白符,\S
匹配非空白符\w
等价于 [a-zA-Z_0-9] 匹配单词字符,包括下划线、横线和数字。\W
匹配非单词字符。
\d\d\d\d\d\w,匹配的是什么呢?
量词
当 \d 出现多次时,完全可以用代表数量的量词来替换,十一个\d
不如一个\d{11}
简单明了。
量词 | 含义 |
---|---|
? | 出现零次或一次(至多一次) |
+ | 出现一次或多次(最少一次) |
* | 出现零次或多次(任意次) |
{n} | 出现 n 次 |
{n,m} | 出现 n 到 m 次 |
{n,} | 至少出现 n 次 |
{0,n} | 出现最多 n 次 |
这时,\d{20}\w\d?\w\w+\d*\d{3}\w{3,5}\d{3,}
便可以达到大道至简的地步,用可视化工具 Regexper 来直观表示如下。
修饰符
之前一直提到 //g
是字面量正则表达式加上 g
, global 全局模式查找符合规则的文本,而全局模式是默认关闭的。g
在这里存在,便称作正则表达式修饰符。它可不是元字符。
其它修饰符有:i
,ignore case,代表忽略大小写,默认是不忽略的;m
,multiple lines,跳过回车符等字符,在多行文本中进行匹配。
JavaScript 中的 RegExp() 方法
test()、exec() 以及 compile()。
- test() 方法检索字符串中的指定值。返回值是 true 或 false。
- exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。您可以向 RegExp 对象添加第二个参数,以设定检索。例如,如果需要找到所有某个字符的所有存在,则可以使用
g
参数。 - compile() 方法用于改变 RegExp。compile() 既可以改变检索模式,也可以添加或删除第二个参数。
下例代码可以实践这一概念。
分组
经过正则表达式匹配到的文本不一定非得替换,有时我们还需要利用。例如用正则表达式将日期 2017-03-12 变成 03/12/2017 的格式,就需要在找出年月日的同时重新排序,这时便用的到“分组”的概念。
^(\d{4})[/-](\d{2})[/-](\d{2})$
可视化结果如下,看到了group
关键字。
上例正则表达式匹配时,用()
包住符合匹配规则的对象,这时,第一个被包住的(\d{4})
是一个group
,会把“年”赋值给$1
,月、日便更好理解,分别为$2
、$3
。如何实践?
var reg = /^(\d{4})[/-](\d{2})[/-](\d{2})$/;
var string = "2017-03-12";
string.replace(reg, '替换前:$1-$2-$3, 替换后:$2/$3/$1');
以及更多
到了这里,也仅仅是开始,正则表达式是最需要自己动手去练习的知识点。还有更多的概念如正则表达式的零宽断言、负向零宽断言、注释、贪婪与懒惰等就不细细说来。
5
正则官网实战。FCC 西安社区的主页,第一次公开到大家面前,是这个样子,切合这次分享的内容。并新增环节,在官网上利用 Chrome 开发者工具直接实战,两道题目任你挑战。答案呢,直接就贴在下方了。看与不看,“借鉴”与否,是自己的选择,学到内容就好。
6
FCC 线下编程社区不可或缺的环节,编程实战!虽然线上我们可以做,但线下一起在线上做题的体验,你有没有体验过呢?有问题,及时的互帮互助了。
End
我可能有个“假特长”,在上面的破冰活动中,“熟悉前端和后台”当然是还不可能是我的真特长了。一个直奔全栈目标、只有一年半学习时间的 Web 学徒,在“熟悉”面前,更应谦虚为妙。也只是,略懂皮毛罢了。
FCC 西安第五次的活动就到了这里,相比较成都社区举办过的 10+ 次活动和主页开发,相比最早成立的北京社区的整体技术更强性,FCC 西安,还有很多路要走。
在 FCC 这个新兴无校园大学中,怎么毕业,就要看每个学员自己的选择。
- Hello,我是韩亦乐,现任本科软工男一枚。软件工程专业的一路学习中,我有很多感悟,也享受持续分享的过程。如果想了解更多或能及时收到我的最新文章,欢迎订阅我的个人微信号:韩亦乐。我的简书个人主页中,有我的微信个人订阅号二维码和 Github 主页地址;我的知乎主页 中也会坚持产出,欢迎关注。
- 本文内部编号经由我的 Github 相关仓库统一管理;本文可能发布在多个平台但仅在上述仓库中长期维护;本文同时采用【知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议】进行许可。