正则
一、理论
所有的开发中百分百都会使用,不会用复杂的,一般几种情况下使用:验证、拆分、替换;
理论很简单,这里都懒得说了,也没有什么好说的,正则比较普通方法用起来快,比较简化。
二、记忆:
正则是在java1.4版本加入的,最早起源于liunx的,在java中是通过apache下载相关的正则开发包才可以完成,也就是java.util.regex(这个就是正则的jar包),其中包里含有两大类:1.pattern;2.Matcher;这两个类几乎不使用,我们只需记下以下常用的即可:
常用(记)
1.字符(如果不加入量词,表示单个字符)
如:
a:表示由指定的字母a组成;(同理其他字母也可以)
输出为trun,若是str=“ab”,输出就为false了,除非str.matches(“ab”)输出才是true;
\\:匹配一个“\”,也就是转移字符
这会报错,两个\\就是一个\
\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], 例如(差不多)
这样是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.量词描述:如果没有量词,那么每一个出现的正则都只能匹配一个字符;
表达式? :表示此正则表达式可以出现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对正则的支持(范例欣赏)
范例:进行替换
要求把非字母拆掉
输出:
正则的原理就是离散型数学,我也没有学会。
范例:进行拆分
按照数字拆分,有些说写[0-9]
可是结果:
所以要这么写:
//一般不会这么写,应该是:
结果是:
对于替换和拆分使用正则并不麻烦,最麻烦的是进行字符串的结构验证;
范例:判断某一个字符串是否是消失,如果是则将其转换为Double类型
比如:str = “10.2”
这里要进行拆分分析,一般大家都会这么拆分的
代码如下,输出是10.2没错:
若是写str="10.",这个支持这种语法也没错,但是这种写法不合理(数学没有这种写法,最少后面跟着小数位),按照上面的代码,“10.”这样的格式不会报错,还是true,所以我们不能这么写;
小数点和2是什么关系,有小数点才会有小数位
所以要这么分析,加个括号
代码如下:
这种情况,运行结果就会是false了。
只有小数点跟小数位同时出现,比如str="10.1",这时候才是true
范例:匹配日期
如果想要将字符串变成日期则一定要使用SimpleDateFormat程序类,但是这个类需要满足特定的程序要求
输出:
范例:匹配电话号码
老规矩,写代码前先分析,第一种,电话号码一般是七位到八位,所以
代码就出来了:
输出:
第二种形式,前面010和-看成一体:
代码也简单出来了:
第三种形式分析如下,注意这里括号和\\太多别搞错:
代码如下,谁看着不晕?所以一下子直接写完不可能,要先分析,慢慢写
输出也是true
正则验证email是相当好用
范例:验证email地址
1.简单验证,email由字母、数字、_组成,例如:a@a.c
我们先分析:
所以代码如下:
2.完整验证:在email的用户名可以由字母、数字、_、-、.组成和长度最大数量6-30位,其中要求以字母开头,域名后缀只能是:
例如:
先分析,其中{5,29}是因为首字母占了一个,减1即可,还有com判断记得加的括号()是这个,不能是中括号
代码如下:
六、java.util.regex包中的直接操作(这个不作为重点)
拆分例子:
输出:
以上操作String也存在此方法,所以这里我们一般不用Pattern类
Matcher类主要是进行匹配
Matcher主要是取得实例化对象:
在Matcher类由如下方法:
1.字符串匹配:
2.字符串替换:
范例:匹配操作
输出,感觉不如String方便:
只有在复杂操作才用到此方法,比如分组操作,一般用不到。
Pattern和matcher这两个类主要功能都在String中提供了支持,所以大部分情况下不考虑使用这两个类。
总结:
正则表达式提供了更为强大的字符串验证与操作的功能,对于正则操作常用标记必须记熟,什么语言都有正则,虽然调用形式不同,但是标准正则支持是完全一样的。
100%拿下。