正则表达式 - Java高级特性 5

目录

认识正则表达式

常用的正则标记

String类对正则的支持

java.util.regex包


学习笔记

通过之前一系列的分析,发现String是一个非常万能得类型,因为String不仅可以支持各种字符串操作处理,也支持向各个数据类型转换得功能,所以在项目开发之中,只要是用户输入的信息基本上都用String表示。于是在向其它类型转换的时候,为了保证转换的正确性,往往需要对其进行一些复杂的验证处理,那么在这种情况下如果之只是单纯的依靠String类中的方法是非常麻烦的。

认识正则表达式

现在假设有一个字符串,要求你判断是否由数字所组成,如果由数字所组成则将其变为数字进行乘法运算。

范例:传统做法 

package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "123" ;
		if(isNumber(str)) {
			int num = Integer.parseInt(str) ;
			System.out.println(num * 2);
		}
	}
	public static boolean isNumber(String str) {
		char data [] = str.toCharArray() ;
		for (char temp : data ) {
			if (temp > '9' || temp < '0') {
				return false ;
			}
		}
		return true ;
	}
}
 

实际上这种验证的功能是非常简单的,但是需要开发者编写大量的代码,那么更加复杂的验证呢?那么在这样的情况下,对于验证来讲,最好的做法是使用正则表达式。

范例:使用正则表达式实现相同功能

package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "123" ;
		if(str.matches("\\d+")) {
			int num = Integer.parseInt(str) ;
			System.out.println(num * 2);
		}
	}
	
}
 

正则表达式最早是从Perl语言里面发展来的,而后在JDK1.4以前如果需要使用到需要导入其他*jar文件。之后正则已经默认被JDK所支持,并且提供java.util.regex开发包,同时针对String类进行了一些修改,可以由方法直接支持正则的处理。

使用正则最大特点在于:方便进行验证处理、方便进行复杂字符串的修改处理。

常用的正则标记

如果要想进行正则操作,那么首先需要对常用的正则标记有所掌握,在java.util.regex包中提供有一个Pattern程序类,在这个类里面提供有所有支持的正则标记。

1、【数量:单个】字符匹配

  • 任意字符:表示由任意字符组成;
  • \\:匹配“\” 
  • \n:匹配换行
  • \t :匹配制表符 
package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "a" ; // 要判断数据
		String regex = "a" ; // 正则表达式
		System.out.println(str.matches(regex));
	}
}
 

2、【数量:单个】字符集(可以从里面任选一个字符)

  • [abc]:表示可能是字母a、b、c中的任意一个
  • [^abc]:表示不是由a、b、c中任意一个;
  • [a-zA-Z]:表示由任意字母组成,不区分大小写;
  • [0-9]:表示由一位数字组成;
package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "1" ; // 要判断数据
		String regex = "[a-zA-Z]" ; // 正则表达式
		System.out.println(str.matches(regex));
	}
}
 

3、【数量:单个】简化字符集:

  • . :表示任意的一个字符
  • \d:等价于“[0-9]”
  • \D:等价于于“[^0-9]”
  • \s:匹配任意的一位空格,可能是空格、换行、制表符
  • \S:匹配任意的非空格数据;
  • \w:匹配字母、数字、下划线,等价于[a-zA-Z_0-9] ;
  • \W:匹配非字母、非数字、非下划线,等价于[^a-zA-Z_0-9] ;
package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "1 " ; // 要判断数据
		String regex = "\\D\\s" ; // 正则表达式
		System.out.println(str.matches(regex));
	}
}
 

4、边界匹配

  • ^:匹配边界开始;
  • $:匹配边界结束

5、数量表达,默认情况下只有添加数量单位可以匹配多位字符

  • 表达式?:该正则可以出现0次或者1次;
  • 表达式*:该正则表示出现0次、1次或多次 ;
  • 表达式+:该正则可以出现1次或多次;
  • 表达式{n}:表达式的长度正好n次;
  • 表达式{n,}:表达式的长度在n次及以上
  • 表达式{n,m}:表达式的长度在n~m次之间
package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "adfaff" ; // 要判断数据
		String regex = "\\w+" ; // 正则表达式
		System.out.println(str.matches(regex));
	}
}
 

6、逻辑表达式:可以连接多个正则

  • 表达式X表达式Y:X表达式之后紧跟上Y表达式
  • 表达式X | 表达式Y:有一个表达式满足即可;
  • (表达):为表达式设置一个整体描述,可以为整体描述设置数量单位。

String类对正则的支持

在进行正则表达式 处理大部分情况下都会基于String类来完成,并且在String提供如下与正则有关的方法:

No方法名称类型描述
01
public boolean matches​(String regex)
普通将指定字符串进行正则判断
02
public String replaceAll​(String regex, String replacement)
普通替换全部,替换为replacement
03public String replaceFirst​(String regex, String replacement)普通替换首个
04
public String[] split​(String regex)
普通正则拆分
05
public String[] split​(String regex, int limit)
普通拆分为指定个数

下面通过一些范例来对正则的使用进行说明。

范例:实现字符串的替换(删除非字母与数字)

package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "adsfasdf87690423592@$#%@^#@#%@#$adfaff" ; 
		String regex = "[^a-zA-Z0-9]+" ; // 正则表达式
		System.out.println(str.replaceAll(regex, ""));
	}
}

范例:实现字符串的拆分

package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "a11b22c333333d44e55f66g" ; 
		String regex = "\\d+" ; // 正则表达式
		// 方法一:System.out.println(str.replaceAll(regex, ""));
		String result [] = str.split(regex) ;
		for (String temp : result) {
			System.out.print(temp + "、");
		}
	}
}
 

在进行正则处理的时候对于拆分与替换的操作相对容易些,但是比较麻烦的是数据验证部分。

范例:判断一个数据是否为小数

package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "100" ; 
		String regex = "\\d+(\\.\\d+)?" ; // 正则表达式   //100.不是小数,100是 
		System.out.println(str.matches(regex));
	}
}
 

范例:现在判断一个字符串是否由日期所组成,如果是由日期组成,将其转为Date类型

package cn.ren.demo;

import java.text.SimpleDateFormat;

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "4900-12-12" ; 
		String regex = "\\d{4}-\\d{2}-\\d{2}" ;   
		if (str.matches(regex)) {
			System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
		}
	}
}
 

需要注意的是,正则表达式无法对里面的内容进行判断,只能够对对格式进行判断处理。

范例:判断给定的电话号码是否正确

  • 电话号码:51273346    \\d{7,8}、01051273346    \\d{3,4}\\d{7,8}、(010)-51273346   \\(\\d{3,4}\\)-\\d{7,8}
package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "(010)-51273346" ; 
		String regex = "((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}" ;  
		System.out.println(str.matches(regex));
	}
}
 

既然已经可以使用正则进行验证了,那么下面就可以利用其来实现一个email地址格式的验证。

范例:验证email格式

  • email的用户名可以由字母、数字、_组成,不能用下划线开头
  • email的域名可以由字母、数字、_、-所组成
  • 域名的后缀必须是:.cn、.com、.com.cn、. gov

package cn.ren.demo;	

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "renjava77777@ren.com.cn" ; 
		String regex = "[a-zA-Z0-9]\\w+@\\w+\\.(cn|com.cn|gov)" ;  
		System.out.println(str.matches(regex));
	}
}
 

现在这几种的正则的匹配操作是最常用的几种处理形式。

java.util.regex包

虽然在大部分情况下,利用String类实现正则的操作,但是也有一些情况下需要使用到java.util.regex包中的正则处理类。在这个包里面一共定义有两个类:Pattern(正则表达式编译类)、Matcher(正则匹配)。

1、Pattern类提供有正则表达式的编译处理支持:public static Pattern compile​(String regex)

      同时也提供有字符串的拆分支持:public String[] split​(CharSequence input)

package cn.ren.demo;

import java.util.regex.Pattern;

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "fdajfla34mf!@#dsaf435b#@3fdsf@#%" ; 
		String regex = "[^a-zA-Z]+" ;  
		Pattern pat = Pattern.compile(regex) ; // 编译正则表达式
		String result [] = pat.split(str) ;
		for (String temp : result ) {
			System.out.print(temp + "、");
		}
	}
}
 

2、Matcher类,实现了正则匹配的处理类,这个类的对象实例化依靠Pattern类完成,Matcher中构造方法私有化了

当获取了Matcher类的对象之后就可以利用该类中的方法进行如下操作:

  • 正则匹配:public boolean matches​()
  • 字符串的替换:public String replaceAll​(String replacement)

范例:字符串匹配

package cn.ren.demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		String str = "101" ; 
		String regex = "\\d+" ;  
		Pattern pat = Pattern.compile(regex) ; // 编译正则表达式
		Matcher mat = pat.matcher(str) ;
		System.out.println(mat.matches());

	}
}
 

如果以拆分、替换、匹配三种操作为例,根本用不到java.util.regex开发包,只用String类中的方法就足够了。但是Matcher类里面提供有一种分组的功能,而这种功能是String不具备的。

package cn.ren.demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JavaAPIDemo {
	public static void main(String[] args) throws Exception {
		// 要求取出这个标记#{}中的所有内容
		String str = "INSERT INTO dept(deptno,dname,loc)VALUES(#{deptno},#{dname},#{loc})" ; 
		String regex = "#\\{\\w+\\}" ;  
		Pattern pat = Pattern.compile(regex) ; // 编译正则表达式
		Matcher mat = pat.matcher(str) ;
		while (mat.find()) { // 是否有匹配成功的内容
			System.out.println(mat.group(0).replaceAll("#|\\{|\\}", ""));
		}

	}
}
 

java.util.regex开发包,如果不是进行一些更为复杂的正则处理是很难使用到的,而String类所提供的功能只适合于正则的基本操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值