用“三个问题法”理解正则表达式

 

今天下午啃了正则表达式。我想到了一个方法,即“三个问题”法。希望可以帮助大家理解正则表达式。(忘了说了,看的是php的正则)

      下面来看“三个问题法”,我吗把正则分为三个问题“元素”考虑,即“在哪儿”、“是什么”,“有多少”。下面分别来看一下。

    “在哪”:^与$。^xxx表示以xxx开头;xxx$表示以xxx结尾。
       例子:^china 表示以china开头,匹配:chinaxxxxxxx
                  hello$表示以hello结尾,匹配xxxxxhello

     “是什么”:[ ] 与{} 以及各个常见可打印字符。[ ]中是以范围表示的字符,比如[a-zA-Z]表示所有英文字母,[0-9]表示所有数字。()是枚举方式,比如(xx1|xx2|xx3)表示值匹配xx1 xx2 xx3之中的一个。可打印字符不想多说,需要注意的是和C C++ JAVA C#等等一样,这里有转义字符,需要特殊表示。比如\.表示字符的. 类似的还有| + * ? \ { } ( )$ ^等等。
        例子:^[a-zA-Z][0-9]$表示一个以字母开头,数字结尾的串,匹配a1 b3等等,但是,这只能是一个字母!!

      “有多少了”:在“是什么”中,我们发现正则默认的数量都是1,怎么匹配多个数量的呢?那就要用到“有多少”了。有多少:. 和{}和*以及+还有?。.单独作用可以匹配任何串;{}明确了有多少个;.与{}联合作用是可以明确制定有多少个.前面的字符。比如a.{3}表示有3个a。*表示有0~n个*前面的串(字符),+表示1~n个前面的串(字符),?表示有0~1个。
         例子:^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.(com|net|org|com.cn|net.cn|org.cn|cc|info)+$ 就是一个匹配电子邮件地址的。

        对“有多少”的特殊说明。其实,构造中最麻烦的就是“有多少”的使用方法。我们可以记住这个规则,对于串匹配的一部分,都是以"是什么"+"多少"(+不用写出来)的方式类表示的。

比如^[0-9]{8}$表示北京的电话号码其中前面[0-9]就是"是什么"即数字,{8}为“有多少”,即8个。

再来个复杂点儿的,比如^http://?w{3}\.[a-zA-Z0-9]+\.(com|net|org){1}$

我们把这个串分解成以下几个部分 http://?      w{3}     \.      [a-zA-Z0-9]+     \.    (com|net|org){1}

来看一眼下面的表你就明白了

是什么 有多少
http://? http:// ? 0或者1个
w{3} w(就是字母w) {3} 三个,即三个w
[a-zA-Z0-9]+ [a-zA-Z0-9] 大小写字母或者数字 + 1~n个
\. \. 省略,默认是1

好了,说了这么多,希望我的这种“三个问题”的思考方式可以帮助大家更好的理解正则表达式。

欢迎转载,转载请注明,谢谢!

Leave a Reply

Your email address will not be published. Required fields are marked *