浅谈正则表达式

来源:互联网 发布:域名投资人 编辑:程序博客网 时间:2024/06/05 04:49
背景:最近做项目的时候遇到了一个技术点也谈不上技术点,反正难到了。就是当你想要验证用户输入的ip地址是否正确时,这里的正确包括格式,位数等等关键,百思不得其解,总是达不到包揽全部可能的验证,于是我便想到一个机制-正则表达式,记得以前看到过,还学了一点,没想到这个时候用到了,我便重拾书本,终于把问题解决了。
 
官方解释:正则表达式官方解释:
正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。 (在我理解,就是验证信息,提取过滤信息的一个机制)。下面就来说说他的用法吧。

定义:刚刚已经提到,这里我用我的理解,再次描述一下正则,其实他就是一类规则,这类规则可以让你快速的找到你想要找到的信息,也就是通过这类规则快速匹配信息。 

用处:正则的用处可以说是很常见,而且在各大开发软件中也有很多支持的。用户可以不用繁琐的一个个查找自己想要的信息,通过这个表达式就可以快速查找,和word里面的查找替换有点类似,不过功能确实比查找替换强大的很,因为他还可以查邮箱,ip地址,电话号码等等各种信息。。说了这么多,开始用法吧。

用法:正则里面有5种概念---字符集、量词、字符边界、选择符和捕获组、零宽断言(也可以说是预搜索)
          一.字符集又分为4种:1.普通字符---字母 数字 汉字 下划线 以及在正则里面没有特殊含义的字符(^和-是特殊字符)被称为普通字符,举一个例子,当你输入a的时候,编译器会帮你找到文本中所有的a,汉字,数字,下划线,不是特殊含义的字符也是一样。
                                            2.转义字符:\t代表帮你找到制表符,\n代表帮你找到换行符,\\代表帮你找到\,其他转移字符类似
                                            3.自定义字符:这个就灵活多了,如果说我想找到文本当中的所有3、5、9,就可以用自定义字符,只要写一个[359],就行了,编译器会自动帮你找到所有的3、5、9,注意不是359,如果找359就把中括号去了,中括号里面的关系属于或。另外中括号里面有如果加上^这个字符那就是取反的意思,比如[^2],意思是只要不是2的,所有的都匹配到,而-也是特殊的字符,比如[2-9]匹配2到9当中任意一个字符,注意,只找到一个,如果想找很多个,那就要涉及到量词了,下面说。
                                            4.标准字符:这个就显得没那么灵活了。标准字符中有\d,\w,\s,\d代表匹配0-9当中任意一个字符,\w代表匹配字母数字下划线,\s代表匹配空格符,换行符,制表符。如果是大写的DWS那就是取反的意思了。
           二.量词:量词很简单,通过是增加次数的意思,我们知道,正则里面所有的语法匹配都只能匹配一个字母数字或者下划线等等字符,但是很显然,这不符合我们的想法,所以有了量词:
                                               1.{m,n}表示最少m次,最多n次
                                                2.{m}表示出现m次
                                                3.{m,}表示最少出现m次
                                                4.?相当于{0,1}最少出现0次,最多出现1次
                                                5.+相当于{1,}最少出现1次        
                                                6.*相当于{0,}最多出现0次 (最后的这个?   *   +经常用)
             三.字符边界:量词说完了,下面就要说说字符边界了,老是匹配字符好无聊,能不能匹配边界呢,这里说的有点抽象,就把他当做开头和结尾这两个位置吧,注意是位置。其实是可以的,字符边界匹配的就是位置,而不是字符了:
                                        1.^我们在字符集当中的普通字符说过,没有特殊含义的字符也是普通字符集,在这^就是特殊字符集,其实在上面已经提到,字符集当中的自定义字符中的^表示取反,在这里^表示字符开始的位置。
                                        2.$相反的,$就是字符结束的位置
                                        3.还有一个特殊的\b就是匹配单词边界,意思为单词的两边不能都出现\w(\w也就是字母数字下划线)
             四:选择符和捕获组:
                                        1选择符很好理解,相当于位运算里面的|(或),可以想象,只要在它两边的我都能匹配的到。
                                        2.捕获组,这个就不好理解了,我也不知道能不能说得通,其实我们在匹配的时候通常有想找重复的部分,比如你想找aa,bb,cc,你当然可以直接输入aa,bb,cc也可以输入a{2},c{2},b{2},但是如果重复的多,那就要考虑捕获组了,顾名思义,我把想要匹配的一部分先存起来,然后\1就可以了。比如找aa,就可以 (a)括起来相当于一个捕获组,加一个\1就是(a)\1,这样就相当于aa了,是不是很简单,其实就是这样的,有捕获组,当然也有非捕获组,如果我不想要重复的部分,那就可以先不存入内存,(?:a)\1 匹配的就是a了。
            五:预搜索(零宽边界)
                    其实前面匹配的东西都有字符,当然,字符边界他没有字符,和预搜索一样也是零宽,就是没有宽度。这个概念说起来很抽象,我用简单的话形容一下,就是我要你前面什么格式,后面什么格式,中间的内容让匹配字符的语法来做就行了,不关我事,这样应该就很清晰了。
                        1.(?=exp)后面应该什么格式
                        2.(?!exp)后面不应该什么格式 
                        3.(?<=exp)前面应该什么格式 
                        4. (?<!exp)前面不应该怎么样
总结:到此为之:正则的语法基本就说完了 。总结下来,正则的用处还是很大的,在很多地方都有涉及。
在eclipse中,提供了两个类,Pattern和Matcher来操作正则,用法一样的。

最后送大家正则表达式的匹配实例:
        
匹配HTML标记的正则表达式:<(S*?)[^>]*>.*?|<.*? />
        匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
        匹配网址URL的正则表达式:[a-zA-z]+://[^s]* 
        匹配国内电话号码:d{3}-d{8}|d{4}-d{7}
        匹配腾讯QQ号:[1-9][0-9]{4,}
        匹配身份证:d{15}|d{18} 
        匹配中国邮政编码:[1-9]d{5}(?!d)
        匹配ip地址:d+.d+.d+.d+ 
0 0