正则表达式
正则表达式最早是从UNIX系统的工具组件中发展而来的,在JDK 1.4以前如果需要使用到正则表达式的相关定义则需要单独引入其它的*.jar文件,而从JDK 1.4之后,正则已经默认被JDK所支持,并且提供有java.util.regex开发包,同时针对于String类也进行了一些修改,使其可以有方法直接支持正则处理
范例:使用正则表达式
public class JavaAPIDemo358 {
public static void main(String[] args) {
String str="123";
if(str.matches("\\d+")) { //结构匹配 判断是否为多位数字
int num=Integer.parseInt(str);//将字符串转换为int型数据类型
System.out.println(num*2);
}
}
}
执行结果
2
15.13.1常用正则标记
java.util.regex.Pattern中
1、字符:匹配单个字符
- a:表示匹配字母a;
- \:匹配转义字符“\”;
- \t:匹配转义字符“\t”;
- \n:匹配转义字符“\n”;
2、一组字符:任意匹配里面的一个单个字符;
- [abc]:表示可能是字母a,可能是字母b或者是字母c;
- [^abc]:表示不是字母a、字母b、字母c的任意一个;
- [a-zA-Z]:表示全部字母中的任意一个;
- [0-9]:表示全部数字的任意一个;
3、边界匹配:在以后编写JavaScript的时候使用正则中要使用到;
- ^:表示一组正则的开始;
- $:表示一组正则的结束;
4、简写表达式:每一位出现的简写标记也只表示一位; - .:表示任意的一位字符;
- \d:表示任意的一位数字,等价于“[0-9]”;
- \D:表示任意的一位非数字,等价于“[^0-9]”;
- \w:表示任意的一位字母、数字、,等价于“[a-zA-Z0-9]”;
- \W:表示任意的一位非字母、数字、,等价于“[^a-zA-Z0-9]”;
- \s:表示任意的一位空格,例如:\n、\t等;
- \S:表示任意的一位非空格;
5、数量表示:之前的所有正则都只是表示一位,如果要想表示多位,则就需要数量表示。
- 正则表达式?:此正则出现0次或1次;
- 正则表达式*:此正则出现0次、1次或多次;
- 正则表达式+:此正则出现1次或多次;
- 正则表达式{n}:此正则出现正好n次;
- 正则表达式{n,}:此正则出现n次以上;
- 正则表达式{n,m}:此正则出现n ~ m次。
6、逻辑表示:与、或、非
- 正则表达式A正则表达式B:表达式A之后紧跟着表达式B;
- 正则表达式A|正则表达式B:表示表达式A或者是表达式B,二者任选一个出现;
- (正则表达式):将多个子表达式合成一个表示,作为一组出现。
15.13.2String类对正则的支持
范例:实现字符串替换(删除非字母与数字)
public class JavaAPIDemo360A {
public static void main(String[] args) {
String str="liliu@#$%";
String regex="[^a-zA-Z0-9]+";
System.out.println(str.replaceAll(regex, ""));
}
}
执行结果
liliu
范例:实现字符串拆分
public class JavaAPIDemo360B {
public static void main(String[] args) {
String str="k555h4448h54f555r44k4";
String regex="\\d+";
String [] result=str.split(regex);
for (int i = 0; i < result.length; i++) {
System.out.print(result[i]+" ");
}
}
}
执行结果
k h h f r k
范例:判断一个数据是否为小数,如果是小数则将其转换double型
public class JavaAPIDemo361A {
public static void main(String[] args) {
String str = "100.1"; // 要判断的数据内容
String regex = "\\d+(\\.\\d+)?"; // 正则表达式
if (str.matches(regex)) { // 正则匹配成功
double num = Double.parseDouble(str) ; // 字符串转double
System.out.println(num); // 直接输出
} else {
System.out.println("内容不是数字,无法转型。");
}
}
}
执行结果
100.1
范例:判断一个字符串是否由日期所组成,如果是由日期所组成则将其转为Date类型
import java.text.ParseException;
import java.text.SimpleDateFormat;
public class JavaAPIDemo361B {
public static void main(String[] args) throws ParseException {
String str="1998-06-14";
String regex="\\d{4}-\\d{2}-\\d{2}";
if(str.matches(regex)) {
System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(str));
}
}
}
执行结果
Sun Jun 14 00:00:00 CST 1998
范例:判断电话号码格式是否正确
在本程序中电话号码的内容有如下三种类型:
- 电话号码类型一(7 ~ 8位数字):51283346(判断正则:“\d{7,8}”);
- 电话号码类型二(在电话号码前追加区号):01051283346(判断正则:“(\d{3,4})?\d{7,8}”);
- 电话号码类型三(区号单独包裹):(010)-51283346(判断正则:“((\d{3,4})|(\(\d{3,4}\)-))?\d{7,8}”);
public class JavaAPIDemo361C {
public static void main(String[] args) {
String str="(010)-51283346";
String regex="((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}"; // 正则表达式
System.out.println(str.matches(regex));// 正则匹配
}
}
执行结果
true
范例:验证Email格式
现在要求一个合格的Email地址的组成规则如下:
- email的用户名可以由字母、数字、所组成(不应该使用“”开头);
- email的域名可以由字母、数字、_、-所组成;
- 域名的后缀必须是:.cn、.com、.net、.com.cn、.gov;
public class JavaAPIDemo362 {
public static void main(String[] args) throws Exception {
String str = "[email protected]"; // 要判断的数据
String regex = "[a-zA-Z0-9]\\w+@\\w+\\.(cn|com|com.cn|net|gov)"; // 正则表达式
System.out.println(str.matches(regex)); // 正则匹配
}
}
执行结果
true
15.13.3 java.util.regex包支持
Pattern类的常用方法(正则模式):
Matcher类的常用方法(匹配):
范例:使用Pattern类实现字符串拆分
public class JavaAPIDemo363A {
public static void main(String[] args) throws Exception {
String str = "ll()lia$()java&*()#@Python" ; // 要拆分的字符串
String regex = "[^a-zA-Z]+" ; // 正则匹配标记
Pattern pat = Pattern.compile(regex) ; // 编译正则表达式
String result [] = pat.split(str) ; // 字符串拆分
for (int x = 0 ; x < result.length ; x ++) { // 循环输出拆分结果
System.out.print(result[x] + "、");
}
}
}
执行结果
ll、lia、java、Python、
范例:使用Matcher类实现正则验证
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaAPIDemo363B {
public static void main(String[] args) {
String str="101";
String regex="\\d+";
Pattern pat=Pattern.compile(regex);
Matcher mat=pat.matcher(str);
System.out.println(mat.matches());
}
}
执行结果
true
范例:使用Matcher类实现字符串替换
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JavaAPIDemo364 {
public static void main(String[] args) {
String str="ljmfdvsnui$#$%reh!#$%";
String regex="[^a-zA-Z0-9]";
Pattern pat=Pattern.compile(regex);
Matcher mat=pat.matcher(str);
System.out.println(mat.replaceAll(""));
}
}
执行结果
ljmfdvsnuireh
范例:使用Matcher类实现数据分组操作
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class avaAPIDemo364B {
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);// 获取Matcher类实例
while (mat.find()) { // 是否有匹配成功的内容
// 获取每一个匹配的内容,并且将每一个内容中的“#{}”标记替换掉
String data = mat.group(0).replaceAll("#|\\{|\\}", "") ;
System.out.print(data + "、");
}
}
}
执行结果
deptno、dname、loc、