Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[B06]MEAN 架构下的 FCC | FCC 西安线下编程活动体验 #05 #38

Open
hylerrix opened this issue Sep 19, 2017 · 0 comments
Open

Comments

@hylerrix
Copy link
Owner

hylerrix commented Sep 19, 2017

相距 FCC 西安第一次线下编程活动,从 2016 年 09 月 16 日到 2017 年 03 月 12 日,半年的时间,在这个社区,发生了很多很多难忘的故事。身为小小组织者的我,也将很多成长中的“第一次”挥洒到了这里。FCC 西安,伴随每一位开发者茁壮成长。

不是我们跟奇数过不去,反而恰巧,在第一、三、五次,活动办得最有意思也最具干货。就不细细讲来其中的缘由。

这次,FCC 西安进高校,西安邮电大学一个新开的,很棒的大学生创业咖啡馆里,分享编程人♀生。

freeCodeCamp西安第一次线下编程活动体验
freeCodeCamp西安第三次线下编程活动体验

Coffee N Code

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 字母中所有字母组成一类,只要能匹配到这一类的任意一个就满足匹配规则。”,就用到了字符类。一般情况下,正则表达式的一个字符对应字符串的一个字符,而用 [] 来构建一个简单的类。^ 来创建一个反向类。

怎么理解呢?以下两行代码中,第一行将字符串中所有 abc 的字符替换成 X 字符。而第二行则代表将字符串中所有不是 abc 的字符替换成 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 开发者工具直接实战,两道题目任你挑战。答案呢,直接就贴在下方了。看与不看,“借鉴”与否,是自己的选择,学到内容就好。

https://freecodecamp-xian.github.io/

6

FCC 线下编程社区不可或缺的环节,编程实战!虽然线上我们可以做,但线下一起在线上做题的体验,你有没有体验过呢?有问题,及时的互帮互助了。

End

我可能有个“假特长”,在上面的破冰活动中,“熟悉前端和后台”当然是还不可能是我的真特长了。一个直奔全栈目标、只有一年半学习时间的 Web 学徒,在“熟悉”面前,更应谦虚为妙。也只是,略懂皮毛罢了。

FCC 西安第五次的活动就到了这里,相比较成都社区举办过的 10+ 次活动和主页开发,相比最早成立的北京社区的整体技术更强性,FCC 西安,还有很多路要走。

在 FCC 这个新兴无校园大学中,怎么毕业,就要看每个学员自己的选择。

@hylerrix hylerrix changed the title [B12]“消失”的这俩个月里,我的前端项目如何从零开始 [B06]MEAN 架构下的 FCC | FCC 西安线下编程活动体验 #05 Sep 20, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant