正则表达式

正则表达式

在项目的开发之中,只要是用户输入的信息基本上都是用String类型表达的,在String类型的数据转换到其他类型的时候吗,为了保证转换的正确性,往往需要对其进行一些复杂的验证处理,这种情况下如果单纯的依靠String类中的方法是非常麻烦的

1、认识正则表达式

假设有一个字符串要求你判断字符串是否由数字所组成,如果是,则将其转换后的数字进行乘法计算

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

实际上这种验证功能是非常简单的,但是这样如此简单的功能却需要开发者编写大量的程序逻辑代码,但是加入更加复杂的验证呢?

对于验证最好的做法就是利用正则表达式来完成

范例:使用正则表达式实现同样效果

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

使用正则表达式最大的特点在于方便进行验证处理,以及方便进行复杂字符串的修改处理

2、常用正则标记(背)

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

①、数量:单个字符匹配

  • 任意字符:表示由任意字符组成
  • 两个\:匹配“\”
  • \n:匹配换行
  • \t:匹配制表符

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

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

③、数量:单个简化字符集

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

④、边界匹配

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

⑤、数量表示,默认情况下只有添加了数量单位才可以匹配多为字符

  • 表达式?:该正则可以出现0次或1次
  • 表达式*:该正则可以出现0次、1次或多次
  • 表达式+:该正则可以出现1次或多次
  • 表达式{n}:表达式的长度正好为n次
  • 表达式{n,}:表达式的长度为n次以上
  • 表达式{n,m}:表达式的长度为n次到m次之间

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

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

3、String类对正则的支持

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

No方法名称类型描述
1public boolean matches(String regex)普通将指定字符串进行正则判断
2public String replaceAll(String regex , String replacement)普通替换全部
3public String replaceFirst(String regex , String replacement)普通替换首个
4public String[] split(String regex)普通正则拆分
5public String [] (String regex , int limit)普通正则拆分

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

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

public class JavaAPIDemo {
	public static void main(String[] args) {
		String string = "basd1684861236551@684fse%^654fasd";    //要判断的数据
		String regex = "[^a-zA-Z0-9]+";     //正则表达式
		System.out.println(string.replaceAll(regex , ""));
	}
}

范例:实现字符串的拆分

public class JavaAPIDemo {
	public static void main(String[] args) {
		String string = "t123asdf456zxcv789qwer";    //要判断的数据
		String regex = "\\d+";     //正则表达式
		String result [] = string.split(regex);
		for (int i = 0; i < result.length; i++) {
			System.out.println(result[i] + "、");
		}
	}
}

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

范例:判断一个数据是否为小数,如果是小数,则将其变为double类型

public class JavaAPIDemo {
	public static void main(String[] args) {
		String string = "99.99";    //要判断的数据
		String regex = "\\d+(\\.\\d+)?";     //正则表达式
		System.out.println(string.matches(regex));
	}
}

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

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		String string = "2022-01-01";    //要判断的数据
		String regex = "\\d{4}-\\d{2}-\\d{2}";     //正则表达式
		if (string.matches(regex)) {
			System.out.println(new SimpleDateFormat("yyyy-MM-dd").parse(string));
		}
	}
}

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

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

  • 电话号码:12245592
  • 电话号码:01012245592
  • 电话号码:(010)-12245592
public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		String string = "(010)-12245592";    //要判断的数据
		String regex = "((\\d{3,4})|(\\(\\d{3,4}\\)-))?\\d{7,8}";     //正则表达式
		System.out.println(string.matches(regex));
	}
}

利用正则实现email地址格式的验证

范例:验证email格式

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		String string = "fuchen1024@qq.com";    //要判断的数据
		String regex = "[a-zA-Z0-9]\\w+@\\w+\\.(cn|com|com.cn|net|gov)";     //正则表达式
		System.out.println(string.matches(regex));
	}
}

4、java.util.regex开发包

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

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

同时也提供有字符串的拆分操作:public String [] split(CharSquence input)

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		String string = "fsadfas&^Y(*(&ufaiohdfa(*&asdfasdf";    //要判断的数据
		String regex = "[^a-zA-Z]+";
		Pattern compile = Pattern.compile(regex);
		String result []  = compile.split(string);
		for (int i = 0; i < result.length; i++) {
			System.out.print(result[i]);
		}
	}
}

②、Matcher类。实现了正则匹配的处理类,这个类的对象实例化依靠Pattern类完成

  • Pattern类提供的方法:public Matcher matcher(CharSequence input)

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

  • 正则匹配:public boolean matchers()
  • 字符串操作:public String replaceAll(String replacement)

范例:字符串匹配

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		String string = "101";    //要判断的数据
		String regex = "\\d+";
		Pattern compile = Pattern.compile(regex);
		Matcher matcher = compile.matcher(string);
		System.out.println(matcher.matches());
	}
}

如果纯粹是以拆分、替换、匹配三种操作为例根本用不到java.util.regex开发包,只依靠String类就都可以实现了

Matcher类里面提供有一种分租的功能,而这种分租的功能是String不具备的

public class JavaAPIDemo {
	public static void main(String[] args) throws ParseException {
		//要求取出#{内容}标记的所有内容
		String string = "insert into dept(deptno,dname,ioc) values (#{deptno},#{dname},#{ioc})";    //要判断的数据
		String regex = "#\\{\\w+\\}";
		Pattern compile = Pattern.compile(regex);
		Matcher matcher = compile.matcher(string);
		while (matcher.find()){
			System.out.println(matcher.group(0).replaceAll("#|\\{|\\}",""));
		}
	}
}

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


下一篇:国际化程序实现原理

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyRedScarf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值