码农要会写正则表达式

这两天一直在时不时的和neo4j图数据库打交道。它的查询语句可以使用正则表达式,有一段时间没有自己写过正则表达式了,现在处于能看懂别人写的正则表达式,但是自己写不出来,语法规则都忘了。为了方便接下来的工作,所以特地复习复习正则表达式的语法。

正则表达式简介

    正则表达式是用来匹配字符串的一系列匹配符,具备简介高效的特点,在很多语言中都有支持(java、python、javascript、php等等)。在windows的cmd命令中也同样支持,例如使用命令dir j*,那么只会罗列出所有以j开头的文件和文件夹。

正则表达式基本语法

    正则表达式在在不同语言的支持语法略有不同,本文采用js的进行说明。js中使用正则表达式的方法为str.match(/表达式/),即需要加两个斜杠。以下所有的代码段第一行为代码,第二行为返回结果,实验是在chrome控制台进行的。

    一直认为最好的学习方式就是实际操作,理论谁都能讲一大堆,但是实际做没做出来还真不知道。一个奇葩现象就是教软件工程的老师可能并没有在软件行业待过。

普通匹配符

    普通匹配符能匹配与之对应的字符,默认区分大小写。

正则标记符

i :不区分大小写

g :全局匹配

m :多行匹配(暂不管它,我用的少)

    参数直接加在最后一个斜杠的后面,比如”Hello Regx”.match(/regx/==i==),可以加多个参数。

    之前是表达式一旦匹配成功,就不再向字符串后面查找了,加上g后,表示进行全局查找。最后返回的是一个数组。

多匹配符

\d :匹配数字,即0~9

\w :匹配数字、字母、下划线

. :匹配除换行的所有字符

    需要注意的是,上面所有的匹配符都只能匹配一个字符。

自定义匹配符

    比如中国的手机号都是以1开头,第二位只能是3、4、5、7、8,第3位只要是数字就行。如何匹配这样的字符串?

[] :匹配[]中的任意一个字符

    如果在[]添加了^,代表取反。即[\^]表示除了中括号中的字符都满足。

修饰匹配次数

    我们的手机号有11位,除了前2位有要求,其他9位度没有要求,那么是不是正则表达式就应该这样写呢?

    很明显,这样写太麻烦,肯定有更好的方式,这里就可以修饰一下匹配次数啦。

? :最多出现1次

+ :至少出现1次

* :出现任意次数

{} :分下面四种情况

代表前面的匹配符出现n次

出现次数在n~m之间

至少出现n次

{, m}最多出现m次

    例子很简单,一看就懂,不浪费时间。

完整匹配

    按照上面的写法会出现下面的问题。

^ :在[]中代表取反,但在外面代表从开始匹配

$ :代表持续匹配到结束

特殊符号

    到这里发现正则表达式确实很强大,仅仅几个简单的符号就能匹配字符串,但是如果我们要匹配的字符本身就是前面用到的符号怎么办呢?

匹配像$、^等特殊符号时,需要加转义字符\

条件分支

    比如现在想匹配图片的文件名,包括jpg、png、jpeg、gif等等,这是多个选项,所以需要像编程语言一样,应该具备条件分支结构。

| :条件分支

() :有两层含义

括号中的内容成为一个独立的整体

括号的内容可以进行分组,单独匹配,若不需要此功能,则(?:)

贪婪与懒惰

    因为在正则表达式中,默认是贪婪模式,尽可能多的匹配,可以在修饰数量的匹配符后面添加?,则代表懒惰。

    到这里应该就差不多了,再深入的,就自我查询知识了。

——END——

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180329G167ZU00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励