Java正则表达式入门基础篇
正则表达式是什么呢,在网上可以搜到很多版本的定义,大致官方的定义便是: 正则表达式,又称规则表达式(Regular Expression,在代码中常简写为regex、regexp或RE),是一种用于操作字符串的规则,其中这些规则使用了一些字符表示,有自己特殊的应用,其作用就是针对于字符串进行操作;正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。
上面这个就是比较通俗的官方定义了,作为一个入门级的小白,我个人对正则表达式的理解就是:它是类似于数据库的查询语句的一种语法规则,数据库的查询语句通过select,group,order by等可以实现自己想要的符合条件的数据,而正则表达式就和它的道理类似,不同之处就是正则表达式是用一些定义好的字符,通过这些字符来实现对一些字符串文本等的检索,过滤掉不符合你编写的程序要求的,替换,匹配,切割等操作来完成自己的程序。再简单点就是比如要判断一个手机号码是不是合法的(是否是11位,是否是数字等),编写代码判断需要好多行的代码,而用正则表达式只用一行代码就可以搞定而且判断的还很全面,这个时候就可以体现出正则表达式的用途和优点了。
正则表达式也算是一种语法,个人觉得想要快速理解的方法就是由简单的例子入手外加简单的语法,先从迷糊迷糊不知所云的定义走到实例中,有了一点具体的理解后,再慢慢由浅入深,深入探究正则表达式的规则语法实用场景等。不再废话,举一个简单的例子吧,
比如北京固定电话都是010-XXXXXX这样的格式,用正则表达式表示获取到的固定电话是否符合要求格式如下:010-\d\d\d\d\d\d\d\d
或者可表示为:010-\d{8}
下面介绍这句话的语法:\d匹配0~9的所有数字
{}用于标记前面子表达式的出现频度
第一种表示方式先是010-,然后是8个数字(\d)
第二种表示方式先是010-然后 \d{8}就是连续匹配八次数字的意思
相比之下要比写一段代码来判断电话号码是否符合要简单多了。
大致明白了正则表达式之后,就来简单看一下它规定的一些语法,
X?X,一次或一次也没有
X*X, 零次或多次
X+X, 一次或多次
X{n}X, 恰好n次
X{n,}X, 至少n次
X{n,m}X, 至少n次,但是不超过m次
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定)
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]] a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]] d、e 或 f(交集)
[a-z&&[^bc]] a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去)
大致了解一点语法后,就用几个例子来运用一下加强理解吧
一、需求:只能输入数字
//不用正则表达式
public class Demo2{
public static void main(String[] args) {
//只能输入数字
String str = "124354232";
char[] arr = str.toCharArray();
boolean flag = true;
for(inti = 0 ; i
if(!(arr[i]>=48&&arr[i]<=57)){
flag = false;
}
}
System.out.println(flag?"输入正确":"输出只能是数字");
}
}
//使用正则表达式
publicclassDemo2{
publicstaticvoidmain(String[] args) {
//只能输入数字
Stringstr = "12435423a2";
booleanflag = str.matches("[0-9]+");
System.out.println(flag?"输入正确":"只能输入数字");
}
}
二、需求:校验QQ号,要求:必须是5~15位数字,0不能开头。
//没有正则表达式之前
publicstaticvoidcheckQQ(Stringqq)
{
intlen = qq.length();
if(len>=5 && len<=15)
{
if(!qq.startsWith("0"))
{
try
{
longl= Long.parseLong(qq);
System.out.println("qq:"+l);
}
catch(NumberFormatException e)
{
System.out.println("出现非法字符");
}
}
else
System.out.println("不可以0开头");
}
else
System.out.println("QQ号长度错误");
}
/*有了正则表达式之后:
[1-9][0-9]{4,14} [1-9]表示是第一位数字是会出现1-9范围之间的其中一个,下来的数字范围会出现在0-9之间,至少出现4次,最多出现14次。*/
publicstaticvoidcheckQQ2()
{
String qq = "12345";
String reg = "[1-9][0-9]{4,14}";
booleanb = qq.matches(reg);
System.out.println("b="+b);
}
三、需求:匹配是否为一个合法的手机号码。
publicstaticvoidcheckTel()
{
String tel = "25800001111";
String reg = "1[35]\\d{9}";//在字符串中,定义正则出现\ 要一对出现。
booleanb= tel.matches(reg);
System.out.println(tel+":"+b);
}
四、根据空格对一段字符串进行切割。
publicstaticvoidsplitDemo()
{
Stringstr = "aa.bb.cc";
str= "-1 99 4 23";
String[]arr = str.split(" +");
for(Strings : arr)
{
System.out.println(s);
}
}
五、需求:把手机号替换成“*”号
String str = "联系我:13425678901联系我:13425678901联系我:13425678901联系我:13425678901联系我:13425678901";
Stringreg= "1[34578]\\d{9}";
str= str.replaceAll(reg,"******");
System.out.println("替换后的帖子:"+ str);
上述例子中用到了一些方法,这些方法都是String类中提供的几个特殊方法:
boolean matches(String regex):判断该字符串是否匹配指定的正则表达式
String replaceAll(String regex,String replacement):返回该字符串中所有匹配正则表达式的子串替换成replacement后的新字符串。
String replaceFirst(String regex,String replacement):返回该字符串中第一个匹配正则表达式的子串替换成replacement后的新字符串。
String[] split(String regex):根据给定的正则表达式拆分该字符串后得到的字符串数组。
此外,Java提供了Pattern和Matcher类专门用于提供正则表达式支持。Pattern对象是正则表达式编译后在内存中的表示形式,因此,正则表达式字符串必须先被编译成Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象,执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。典型的调用顺序如下:
Pattern p =Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
Matcher类提供了如下几个常用方法:
find:返回目标字符串中是否包含与Pattern匹配的子串
group:返回上一次与Pattern匹配的子串
start:返回上一次与Pattern匹配的子串在目标字符串中开始位置
end:返回上一次与Pattern匹配的子串在目标字符串中结束位置加1
lookingAt:返回目标字符串前面部分与Pattern是否匹配
matches:返回整个目标字符串与Pattern是否匹配
reset:可以将现有的Matcher对象应用于一个新的字符序列。
下面通过例子来说明方法的用途
//想要获取由3个字母组成的单词。
public static void getDemo()
{
String str = "da jia zhu
yi le,ming tian bu fang jia,xie xie!";
//这时我们要用到一些正则对象。
String reg = "\\b[a-z]{3}\\b";
Pattern p = Pattern.compile(reg);
Matcher m = p.matcher(str);
while(m.find())
{ System.out.println(m.start()+"...."+m.end()); System.out.println("sub:"+str.substring(m.start(),m.end()));
System.out.println(m.group());
}//在使用group方法之前,必须要先找,找到了才可以取。
}
例二、校验邮件
public static void checkMail()
{
String mail = "abc123@sina.com.cn";
String reg ="[a-zA-Z_0-9]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
boolean b =mail.matches(reg);
System.out.println(mail+":"+b);
}
以上这些基本上就是正则表达式的基础入门了。