Java 正则表达式详解
<p>序言:前两天闲来无事,想起来好久都没回去过学校了(Lz还是个没毕业的孩子>_<)而且早就听说学校新盖的图书馆很高大上,所以就想着去泡泡图书馆,装装逼什么的。</p> <p><img src="https://simg.open-open.com/show/a6cbcc362a9cb9670f41269a9ac1f466.jpg"></p> <p>随手一拍,朦胧美</p> <p>后来走着走着,就看到了IT类的资料,然后就顺便翻了几本看看,然后就看到了Java的正则表达式,因为之前项目中很多地方有用到正则的地方,但是每次都是去网上copy人家的,所以就想着得把这一块好好弄懂,以后自己写正则。以下是自己看完书之后的一些见解,如果有更正确的理解,还请留下你的评论</p> <p><strong>1、什么是正则表达式?</strong></p> <p>正则表达式的定义:这是一种字符串的语法规则,是一种可以用于模式匹配和替换的规则,主要用于文本和字符串的处理(匹配,查找,替换,判断字符串)。一个正则表达式是由普通的字符(a~z)以及特殊字符(元字符)组成的文字模式,用以描述在查找文字主体时待匹配的一个或多个字符串。下面我们会介绍一些常用的元字符</p> <p><strong>2、正则表达式的元字符</strong></p> <p>元字符的定义:元字符:元字符使得正则表达式具有处理能力,指的是那些在正则表达式中具有特殊意义的专用字符,可以规定其前导字符在目标对象中的出现模式</p> <table> <thead> <tr> <th>元字符</th> <th>在正则表达式中的写法</th> <th>意义</th> </tr> </thead> <tbody> <tr> <td>.</td> <td>.</td> <td>任何一个字符</td> </tr> <tr> <td>\d</td> <td>\\d</td> <td>0-9之间的任意一个数字</td> </tr> <tr> <td>\D</td> <td>\\D</td> <td>任何一个非数字字符</td> </tr> <tr> <td>\s</td> <td>\\s</td> <td>空格类字符'\t','\n'等等</td> </tr> <tr> <td>\S</td> <td>\\S</td> <td>非空格类字符</td> </tr> <tr> <td>\w</td> <td>\\w</td> <td>可用于标识符的字符,不包括美元符</td> </tr> <tr> <td>\W</td> <td>\\W</td> <td>不能可用于标识符的字符</td> </tr> <tr> <td>\p{Lower}</td> <td>\\p[Lower]</td> <td>小写字母[a~z]</td> </tr> <tr> <td>\p{Upper}</td> <td>\\p{Upper}</td> <td>大写字母[A~Z]</td> </tr> <tr> <td>\p{ASCII}</td> <td>\\p{ACSII}</td> <td>ASCII字符</td> </tr> <tr> <td>\p{Alpha}</td> <td>\\p{Alpha}</td> <td>字母</td> </tr> <tr> <td>\p{digit}</td> <td>\\p{digit}</td> <td>数字字符[0~9]</td> </tr> <tr> <td>\p{Alnum}</td> <td>\\p{Alnum}</td> <td>字母或数字</td> </tr> <tr> <td>\p{Punct}</td> <td>\\p{Punct}</td> <td>标点符号</td> </tr> <tr> <td>\p{graph}</td> <td>\\p{graph}</td> <td>可视字符,\p{Alnum},\p{Punct}</td> </tr> <tr> <td>\p{Print}</td> <td>\\p{Print}</td> <td>可打印字符</td> </tr> <tr> <td>\p{Blank}</td> <td>\\p{Blank}</td> <td>空格或制表符</td> </tr> <tr> <td>\p{Cntrl}</td> <td>\\p{Cntrl}</td> <td>控制字符[\x00~\x1F\x7F]</td> </tr> </tbody> </table> <p>上面的表中,基本上就是一些比较常用的元字符,我们需要注意元字符在正则表达式中的写法,不能直接用元字符来编写我们的正则程序</p> <p><strong>3、正则表达式中的方括号[]</strong></p> <p>元字符可以是放在[]中的任意单个字符(如[a]表示匹配单个小写字符a),也可以是字符序列(如[a-d]表示匹配a-d即a,b,c,d中的任意一个字符,而\w表示任意英文字母、数字及下划线)。例如:regex="[159]ABC",那么"1ABC","5ABC","9ABC"都是与正则表达式regex匹配的字符,方括号的含义如下:</p> <p>注:方括号内允许嵌套,可以进行交,并,差运算</p> <table> <thead> <tr> <th>方括号表达式</th> <th>含义</th> </tr> </thead> <tbody> <tr> <td>[abcde]</td> <td>匹配a,b,c,d,e中的任意一个字符</td> </tr> <tr> <td>[a-h]</td> <td>匹配a到h之间的任意一个字符</td> </tr> <tr> <td>[^fgh]</td> <td>匹配除f,g,h外的任意一个字符</td> </tr> <tr> <td>[a-d[m-p]]</td> <td>代表a~d,或m~p中的任意一个字符(并)</td> </tr> <tr> <td>[a-z&&[def]]</td> <td>代表d,e或f中的任意一个字符串(交)</td> </tr> <tr> <td>[a-z&&[^bc]]</td> <td>代表a,d,e,f(差)</td> </tr> </tbody> </table> <p><strong>4、正则表达式中的限定符</strong></p> <p>在使用正则表达式时,我们知道元字符一般只能匹配一个位置或一个字符,如果需要某一类型的元字符多次输入,逐个输入,或是要匹配多个字符的时候就相当麻烦,这个时候我们可以使用正则表达式的限定符来重复输入。例如:regex="hello[246]?",那么"hello","hello2","hello4","hello6"都是与regex匹配的字符串,下面是一些常见的限定符</p> <table> <thead> <tr> <th>带限定符号的模式</th> <th>含义</th> </tr> </thead> <tbody> <tr> <td>X?</td> <td>X出现0次或1次</td> </tr> <tr> <td>X*</td> <td>X出现0次或多次</td> </tr> <tr> <td>X+</td> <td>X出现1次或多次</td> </tr> <tr> <td>X{n}</td> <td>X出现n次</td> </tr> <tr> <td>X{n,}</td> <td>X至少出现n次</td> </tr> <tr> <td>X{n,m}</td> <td>X至少出现n至m次</td> </tr> <tr> <td>XY</td> <td>X后面跟Y</td> </tr> <tr> <td>X|Y</td> <td>X或Y</td> </tr> </tbody> </table> <p>然后用法的话相信大家不会陌生吧:</p> <pre> <code class="language-java">String regex="自己定义的正则表达式"; String test="需要正则的字符串对象"; boolean isMatch=test.matches(regex); if(isMatch){ //test为匹配成功的数据 }else{ //test为匹配失败的数据 }</code></pre> <p>可能有些人会说,我经常用到的正则表达式中有 <strong>Pattern</strong> 和 <strong>Matcher</strong> 两个类,这两个类是干嘛的呢?</p> <p>Pattern: 一个 <strong>Pattern</strong> 是一个正则表达式经编译后的表现模式。</p> <p>Matcher: 一个 <strong>Matcher</strong> 对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。</p> <p>首先一个 <strong>Pattern</strong> 实例订制了一个所用语法与 <strong>PERL</strong> 的类似的正则表达式经编译后的模式,然后一个 <strong>Matcher</strong> 实例在这个给定的 <strong>Pattern</strong> 实例的模式控制下进行字符串的匹配工作。</p> <p>好了,上述就是前两天啃书所获得的经验值,不得不说书还是个非常好的东西。</p> <p>这是我建的一个android小白的群,各位有兴趣的小白欢迎加群共同学习,也欢迎各位大神进群指导,共勉。群号:541144061</p> <p> </p> <p>来自:http://www.jianshu.com/p/e55a6fec4c5c</p> <p> </p>
本文由用户 jo4353 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
转载本站原创文章,请注明出处,并保留原始链接、图片水印。
本站是一个以用户分享为主的开源技术平台,欢迎各类分享!