正则表达式学习

[TOC]

简述

正则表达式就是regular expression,简写是regex或者regexp。

正则表达式就是用一组特定字符串来描述一段文本规律,用来查找文本用的,对我来说的话就是在编辑器里面用用。

预热

正则表达式历史悠久,版本众多。细看之下,Vim和Emacs的正则表达式还各有不同的,跟网上找的文档里面也不一样。

推测

regex是使用字符串对文本内容实现查找,这里可以推测一个regex的最小实现就是:输入源文本和regex字符串,输出匹配regex的文本位置。

regex可以实现强大的搜索功能,细想之下,在这个基础上可以实现的功能真是太多了。源代码解析编译肯定是会用到的,比如判定一个变量定义,判定一个赋值语句等,这些内容都需要以regex为基础来实现。还有就是智能编辑器里面,要实现语法高亮,也就是保留关键字、常量、字符串、注释这些需要有不同的字体颜色,这个也是明显需要用到regex的。

特殊字符

首先就是\——反斜杠(back-slash),这个是regex里面的转义符,后面跟其他特定的一些字符会产生匹配符,用来匹配特定的字符。
还有其他的特殊字符,叫做元字符(metacharacter),有

^ . [ ] $ { } * ( ) + | ? < >

这么多,这些在regex里面是本来就有特殊含义的。但是文本里面本来可能是有这些字符的,要匹配这些字符的话就需要在这些元字符前面加上转义符’\’。就像”+“是在文本里面查找’+’。

匹配规则不完全小总结

不是都总结的到,都是一些最最基本的东西。

匹配预定义的字符

一些regex已经预定义好的一些匹配字符规则:

item notes
. 小数点,匹配除换行符以外的任意字符,有点通配符的意思
\w w代表word,匹配字母或者数字或者下划线或者汉字,其实就是一个word的基本组成啦
\s s代表space,匹配空白符,就是空格、tab、换行符这些
\d d代表digit,匹配数字

转义符’\’

有两个用途:

  • 加在特定字符前产生匹配符;
  • 加在元字符前用来匹配文本中的符号。

匹配自定义的字符集合

要匹配自己定义的字符集合的话要就是用”[]”中括号里面加上字符集合来实现,比如要匹配元音字母可以用”[aeiou]”这样来。

“[]”的特殊的地方是大多数元字符在里面是失效的,例外的情况是”\ : ^ -“这四个,’\’还是表示转义,’-‘表示范围。”[a-z0-9A-Z]”就是表示英文大小写和数字的集合。

反义

就是跟匹配规则相反的匹配,有两种情况:

  • 大写:
    • \W 跟\w相对,匹配非字母、数字、下划线和汉字;
    • \S 跟\s相对,匹配非空白字符;
      • \D 跟\d相对,匹配非数字字符。
  • “[]”+”^”–>”[^…]”实现对集合”…”的反义。

匹配次数限定符

指的是对之前的匹配表达式的匹配次数的限定。

item notes
{m,n} 重复匹配m至n次,这里显然m<n,这是最基本的
{n} 重复n次,相当于{n,n}
{m,} 重复至少m次,相当于{m,+∞}
? 重复0或1次,相当与{0,1}
+ 重复至少1次,相当于{1,+∞}
* 重复任意次,相当于{0,+∞}

有了这么几条,其实就已经可以写出很多很多的regex字符串来,比如\d{3,4}-\d{8}——前面3~4个数字,中间一个-,后接8个数字,可以表示一个电话号码,比如028-66666666,要精确一点0577-\d{8},可以匹配区号是0577的号码。

位置匹配符

只匹配位置,不匹配字符的匹配符。

tiem notes
\b 匹配一个字符串的开始或结尾
^ 匹配字符串的开头
$ 匹配字符串的结尾

再强调一下位置匹配符只匹配位置。\b匹配字符串的分界,字符串里面的每个元素都是\w,所以\b可以定义为:一个两侧有一个不是\w的位置。所以^就是——右侧是\w左侧不是的一个位置;$反之。
于是一个字符串可以按这个精确的定义为:^\w+$

未完

regex是很复杂的,不同的环境对regex的支持不一样,还有很多高级的特性没有学习到。

而这里总结的这些是最基础的,使用频率很高,也是被广泛支持的。

饭要一口一口吃,先这样吧。