一、简述

正则表达式,Regular Expression ,又称规则表达式,简写为reg exp。学习String 类的时候,有很多方法中用到了regex。详见维基百科“正则表达式词条” 。

正则表达式是一种带有规律 、格式的表达式。通常用来匹配格式、替换、检索。

作用

在很多开发场景都会看到正则表达式的影子,一言以蔽之,其作用无非一下三种:

1.格式检验;2.拆分替换;3.检索字串

就Java来说,前两个作用通过String类就可以完成了,如:



String



第三个作用需要依赖Pattern模式 ,Matcher匹配器进行操作,将在下文进行详细叙述。

正则表达式的来由

“知其然,知其所以然。”下面简单普及一下正则的由来。

最初的正则表达式出现于理论计算机科学的自动控制理论和形式化语言理论中。在这些领域中有对计算(自动控制)的模型和对形式化语言描述与分类的研究。

正则表达式鼻祖——1940年,沃伦·麦卡洛克与Walter Pitts将神经系统中的神经元描述成小而简单的自动控制元。

1950年代,数学家斯蒂芬·科尔·克莱尼利用称之为“正则集合”的数学符号来描述此模型。肯·汤普逊将此符号系统引入编辑器QED,随后是Unix上的编辑器ed,并最终引入grep。自此以后,正则表达式被广泛地应用于各种Unix或类Unix系统的工具中。正则表达式的POSIX规范,分为基本型正则表达式(Basic Regular Expression,BRE)和扩展型正则表达式(Extended Regular Express,ERE)两大流派。在兼容POSIX的UNIX系统上,grep和egrep之类的工具都遵循POSIX规范,一些数据库系统中的正则表达式也符合POSIX规范。grep、vi、sed都属于BRE,是历史最早的正则表达式,因此元字符必须转译之后才具有特殊含义。egrep、awk则属于ERE,元字符不用转译

或许你没什么兴趣看完上述的东西,但笔者想说:理解原理,也要适时的理解其来龙去脉,用思想层面提升维度。很多知识都是跨学科的,比如SSM的创始人们不少都不是程序员出身。

真正掌握面向对象的编程---> 需要从思维层次去思考 not just code

二、正则表达式的具体使用

笔者不才,记不住太多的正则用法,下文仅仅是从自身的体验出发,列出了最最常用的几个用法。

窃以为,正则归根到底是一个工具而不是用来炫技的,更多用法需要时直接Google即可,记住最基础的才是王道。

基本的表达式:

首先说明,[ ]不是闭区间,而是表达式的开始和结束

可以记一下这几个符号:- ^ & | ,分别表示: 范围 , 非 , 与 或 。

所有的逻辑都可以从上述几个符号组合产生

[abc] : 表示输入的是abc中的一个

[^abc] : 表示输入的不是a、b或者c中的其中一个

[a-z] : 表示a-z字母范围(大写就不行了) 因为底层是Unicode

[A-Za-z] : 表示是字母

[a-z&&[ ^ bc]] : 表示a-z且不是b或者c

简化版

随着表达式越来越长,写起来必然很麻烦,所以有些开发中将常用的范围做了一些简化

. : 代表任意一个子符

数字:d ,等价于[0-9],代表任一个数字 digit

非数字:D ,等价于[ ^0-9]

留白:空格s (space) 回车r 换行n

非留白:S

单词:w [0-9A-Za-z] word单词的意思

非单词:W

再次强调,上述用法都是用来做匹配的——且仅仅匹配一个字符。

匹配多个字符

如果需要匹配的字符不是一个而是多个,则需要用到次数来进行匹配。

带上了次数的正则表达式的总公式: [表达式]{次数}

下面讲解{}中次数的写法:

  • ? :0-1次 (可理解为 “出现过??”)
  • * :0-n次 (出没出现过都行)
  • + :1-n次
  • {n} :固定n次
  • {n,}:至少n次
  • {n,m}:n-m次
//正则表达式 就是一些符号  不用死记硬背



检索



//有一个字符串message(可以从网络、数据库JDBC、IO中读取)



看到这里,笔者想跟小主透露件小知识,String的matches,split,replace等方法,底层所调用的方法也是用到了Pattern和Matcher。不信?请看源码:



/* @since 1.4



三、写在最后

正则表达式是开发过程中涉及到字符串相关操作的一个有力工具,它不是某种语言所独有的特性,主流的开发语言中都有相关正则表达式的用法。

笔者写这篇文章,仅仅是为了给小白们一点参考,或许“从未遇见,一直听说”,至少看了这篇文后,有了最基本的了解。还望大牛们不吝赐教。