技术编程|30 分钟轻松搞定正则表达式基础( 二 )


好了 , 看到此处你应该已经熟记了6个元字符了 。
接下来 , 和平时会经常用到 , 这个肯定比较熟了 , 最后一个元字符‘.’可以理解它匹配一行中的所有元素 , 因为遇到换行符后就不再进行匹配了(万事万物源于一点) 。
用于表示数量
有些元字符用于表示某种元素的数量 , 如\d表示一个数字 , 当你想表示6位数字怎么办?当然可以\d\d\d\d\d\d, 但确实太麻烦了 , 为了简便就需要一些表示数量的元字符 , 上述可以写成\d{6} , 元字符详情如下:
元字符说明
*0个或多个+1个或多个?0个或1个{n}n个{n,}n个或多个{n,m}n到m个(m必须比n大 , 否则语法错误)
这几个元字符还算比较好记 。
*表示0个或多个+表示1个或多个(这个可能会混淆 , 或许你可以这么记 , * 表示1*0=0或多个 , +表示1+0=1或多个)?表示0或1个 , 可以理解成某个人在问你这个类型的元素有还是没有呀?你回答可能有(1)也可能没有(0) 。
剩下的三个只要记住大括号是用来表示数量 , 后续我们还会看到除了{}外 , 还有[]和() 。它们各有各的作用 。
用于表示位置
有些元字符没有具体的的匹配项 , 它只是一个抽象的位置概念 , 它用来表示字符串中的各个位置 。一个字符串的位置可以分成:字符串的开头或结尾、单词的开头或结尾 。
如字符串‘I am a tester_.’ , I前面是字符串的开头位置 , 英文句号后面为字符串的结尾位置 , 每一个word(注意此处指的不是传统意义上的单词)前后的位置即为单词的开头或结尾 , 对于‘tester_’来说t前面是单词开头 , 下划线是单词结尾 。
元字符说明
\b匹配单词的开头或结尾位置^匹配字符串的开头位置$匹配字符串的结尾位置
其中\b在前面的例子中有说过 , 此处可以以这种方式记忆:\b是block(块)的缩写 , 即一个单词是一块内容 , \b是这一块的边界 。至于另外两个元字符 , 暂时没找到很好的记忆方法(^一个尖角 , 小荷才露尖尖角?) , 但应该也不难记 。
此处有个地方要提及一下 , 所有表示位置的不会实际占用字符 。为了理解可以继续看最上面的第二个例子 , \btest\b最终匹配出来了子字符串“test” , 而不是“ test ” 。
大家依据目前了解的元字符概念 , 可以思考一下这个正则表达式^\d{6,10}$ , 和\d{6,10}的区别 。针对字符串‘12345678‘ , 第一个和第二个都可以匹配出’12345678‘ 。
但是针对字符串’W12345678‘ , 只有第二个可以正确匹配出’12345678‘ , 原因在于第一个正则表达式的意思匹配一个字符串只有6-10个数字组成 , 而第二个正则表达式意思是匹配字符串中的6-10个连续数字 。
除了这三个元字符表示位置外 , 还有零宽断言、负向零宽断言也表示位置 , 后续会详细介绍 。
【技术编程|30 分钟轻松搞定正则表达式基础】用于字符转义
字符转义的概念大家肯定不陌生 , 对于*, +等有特殊意义的元字符 , 假如你想匹配5个*号应该怎么写 , *{5}吗?肯定不是 , 这样写是语法错误 , 应该使用\将其转义:\*{5} 。这样一来*的特殊意义就被\给取消了 , 想要匹配\的话 , 也是一样 , 再用一个\把特殊意义取消掉就好了 。
字符集
前面列出了部分用于表示意义的元字符 , 但是可能这几个元字符覆盖的都太广泛了 , 想要具体的匹配某一类字符 。比如就是想匹配abcd这四个字符中的某一个 , 正则表达式当然也是支持的 。
这时候就需要用到第二种括号 , 中括号[] 。匹配abcd中的某一个可以写成[abcd]或者[a-d] , 意思是匹配一个a-d中的任意字符 。相反若匹配非abcd的任意字符 , 可以写成[^abcd] , 意思是匹配一个不是abcd的字符 。
括号内也可以写入不同类型的元素 , 如[a-d1-7@] , 表示的是匹配一个a-d或1-7或@中的任意字符 , [^a-d1-7@]则与之相反


推荐阅读