正则

一、理论

所有的开发中百分百都会使用,不会用复杂的,一般几种情况下使用:验证、拆分、替换;

理论很简单,这里都懒得说了,也没有什么好说的,正则比较普通方法用起来快,比较简化。

 

二、记忆:

正则是在java1.4版本加入的,最早起源于liunx的,在java中是通过apache下载相关的正则开发包才可以完成,也就是java.util.regex(这个就是正则的jar包),其中包里含有两大类:1.pattern;2.Matcher;这两个类几乎不使用,我们只需记下以下常用的即可:

常用(记)

1.字符(如果不加入量词,表示单个字符)

 如:

a:表示由指定的字母a组成;(同理其他字母也可以)

java 正则 匹配点 java正则匹配符号_正则

输出为trun,若是str=“ab”,输出就为false了,除非str.matches(“ab”)输出才是true;

\\:匹配一个“\”,也就是转移字符

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_02

这会报错,两个\\就是一个\

 

\t:匹配“\t”转义字符

\n:匹配换行的转义字符

 

2.字符范围(如果不加入量词,表示单个字符)

如:

[abc]:表示字母中含有a、b、c其中任一位字母即可,大写不行。(也可以写其他)

[^abc]:取反[abc]的(反义词),表示不是字母中含有a、b、c其中任一位字母

[a-zA-Z]:表示任一位字母(大写或小写)组成,如果[a-z],这样就不能是大写

[^a-zA-Z]:取反[a-zA-Z]的(反义词)

 

3.简化表达式

.  :表示任意一位字符(注意,代码里不能直接写.,要加\,如:  \.)

注意:以下的两个\表示一个\

\d :表示任意一位数字,等价于[0-9],   例如(差不多)

java 正则 匹配点 java正则匹配符号_java_03

这样是true,要是str=“a”,就是false了

\D  :取反(\d)的反义词,表示任意一位非数字,等有价于[^0-9],

\w   :表示任意一位字符,由字符、数字、_组成,等价于[a-zA-Z_];(不包含 . ) 

\W  :取反(\w)的反义词,等价于[^a-zA-Z_],如str=“$”,这个是true

\s    :表示任一空格,可能是\n或\t

\S    :取反(\s)的反义词,表示非空格

 

4.边界匹配(一般java很少用,javaScript会用到)

如:

^ :表示正则匹配的开始(java不用)

$ :表示正则匹配的结束

 

 

5.量词描述:如果没有量词,那么每一个出现的正则都只能匹配一个字符;

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_04

表达式? :表示此正则表达式可以出现0次或1次;

str=“”或“1”都是true,如果是=“11”就是false

表达式+   :表示此正则表达式可以出现1次或多次;

 

str=“1”或“111”都是true,如果是=“”就是false

表达式*    :表示此正则表达式可以出现0次、1次或多次;

表达式{n}    :表示此正则表达式可以出现n次,包含n次

表达式{n,m}    :表示此正则表达式可以出现n到m次

 

 

6.逻辑运算

如:

X正则Y正则:表示X正则之后紧跟着验证Y正则;

X正则 | Y正则:表示两个正则选一个;

() :表示一组正则;

 

 

三、String对正则的支持(范例欣赏)

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_05

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_06

 

范例:进行替换

要求把非字母拆掉

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_07

输出:

java 正则 匹配点 java正则匹配符号_正则_08

正则的原理就是离散型数学,我也没有学会。

 

范例:进行拆分

按照数字拆分,有些说写[0-9]

java 正则 匹配点 java正则匹配符号_正则表达式_09

可是结果:

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_10

所以要这么写:

java 正则 匹配点 java正则匹配符号_正则表达式_11

//一般不会这么写,应该是:

java 正则 匹配点 java正则匹配符号_java_12

结果是:

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_13

对于替换和拆分使用正则并不麻烦,最麻烦的是进行字符串的结构验证;

 

范例:判断某一个字符串是否是消失,如果是则将其转换为Double类型

比如:str = “10.2”

这里要进行拆分分析,一般大家都会这么拆分的

java 正则 匹配点 java正则匹配符号_正则表达式_14

代码如下,输出是10.2没错:

java 正则 匹配点 java正则匹配符号_正则表达式_15

若是写str="10.",这个支持这种语法也没错,但是这种写法不合理(数学没有这种写法,最少后面跟着小数位),按照上面的代码,“10.”这样的格式不会报错,还是true,所以我们不能这么写;

小数点和2是什么关系,有小数点才会有小数位

所以要这么分析,加个括号

java 正则 匹配点 java正则匹配符号_java_16

代码如下:

java 正则 匹配点 java正则匹配符号_正则表达式_17

这种情况,运行结果就会是false了。

java 正则 匹配点 java正则匹配符号_正则_18

只有小数点跟小数位同时出现,比如str="10.1",这时候才是true

 

范例:匹配日期

  如果想要将字符串变成日期则一定要使用SimpleDateFormat程序类,但是这个类需要满足特定的程序要求

java 正则 匹配点 java正则匹配符号_正则表达式_19

输出:

java 正则 匹配点 java正则匹配符号_正则表达式_20

 

范例:匹配电话号码

java 正则 匹配点 java正则匹配符号_正则_21

老规矩,写代码前先分析,第一种,电话号码一般是七位到八位,所以

java 正则 匹配点 java正则匹配符号_正则表达式_22

代码就出来了:

java 正则 匹配点 java正则匹配符号_正则_23

输出:

java 正则 匹配点 java正则匹配符号_java_24

第二种形式,前面010和-看成一体:

java 正则 匹配点 java正则匹配符号_java_25

代码也简单出来了:

java 正则 匹配点 java正则匹配符号_java_26

第三种形式分析如下,注意这里括号和\\太多别搞错:

java 正则 匹配点 java正则匹配符号_正则表达式_27

代码如下,谁看着不晕?所以一下子直接写完不可能,要先分析,慢慢写

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_28

输出也是true

正则验证email是相当好用

范例:验证email地址

  1.简单验证,email由字母、数字、_组成,例如:a@a.c

我们先分析:

java 正则 匹配点 java正则匹配符号_java_29

所以代码如下:

java 正则 匹配点 java正则匹配符号_java_30

2.完整验证:在email的用户名可以由字母、数字、_、-、.组成和长度最大数量6-30位,其中要求以字母开头,域名后缀只能是:

java 正则 匹配点 java正则匹配符号_java_31

例如:

java 正则 匹配点 java正则匹配符号_java_32

先分析,其中{5,29}是因为首字母占了一个,减1即可,还有com判断记得加的括号()是这个,不能是中括号

java 正则 匹配点 java正则匹配符号_java_33

代码如下:

java 正则 匹配点 java正则匹配符号_正则表达式_34

六、java.util.regex包中的直接操作(这个不作为重点)

java 正则 匹配点 java正则匹配符号_java_35

拆分例子:

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_36

输出:

java 正则 匹配点 java正则匹配符号_正则_37

以上操作String也存在此方法,所以这里我们一般不用Pattern类

 

Matcher类主要是进行匹配

Matcher主要是取得实例化对象:

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_38

在Matcher类由如下方法:

    1.字符串匹配:

java 正则 匹配点 java正则匹配符号_java_39

    2.字符串替换:

java 正则 匹配点 java正则匹配符号_java 正则 匹配点_40

 

范例:匹配操作

java 正则 匹配点 java正则匹配符号_正则表达式_41

输出,感觉不如String方便:

java 正则 匹配点 java正则匹配符号_正则表达式_42

只有在复杂操作才用到此方法,比如分组操作,一般用不到。

 

Pattern和matcher这两个类主要功能都在String中提供了支持,所以大部分情况下不考虑使用这两个类。

 

总结:

正则表达式提供了更为强大的字符串验证与操作的功能,对于正则操作常用标记必须记熟,什么语言都有正则,虽然调用形式不同,但是标准正则支持是完全一样的。

100%拿下。