Java 正则表达式从入门到“跑路”

日常开发中我们经常会遇到验证用户输入信息的地方,而某些验证就要用到正则表达式。之前总感觉正则神秘莫测,如果你也有同感?那接下来将为你揭开它神秘的面纱。
这里写图片描述

基本概念

正则表达式:具有一定规则的字符串。

组成规则

常用组成规则:

字符 
x  字符 x 
\\ 反斜线字符 
  
字符类 
[abc] a、b 或 c(简单类) 
[^abc] 任何字符,除了 a、b 或 c(否定) 
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围) 
  
预定义字符类 
. 任何字符(与行结束符可能匹配也可能不匹配) 
\d 数字:[0-9] 
\D 非数字: [^0-9] 
\s 空白字符:[ \t\n\x0B\f\r] 
\S 非空白字符:[^\s] 
\w 单词字符:[a-zA-Z_0-9] 
\W 非单词字符:[^\w] 
  
边界匹配器 
^ 行的开头 
$ 行的结尾 
\b 单词边界 
\B 非单词边界 
\A 输入的开头 
\G 上一个匹配的结尾 
\Z 输入的结尾,仅用于最后的结束符(如果有的话) 
\z 输入的结尾 
  
Greedy 数量词 
X? X,一次或一次也没有 
X* X,零次或多次 
X+ X,一次或多次 
X{n} X,恰好 n 次 
X{n,} X,至少 n 次 
X{n,m} X,至少 n 次,但是不超过 m 次 

更多规则查看API Pattern类
如果看到这些规则感到比较困惑,请看下面实例!

1.判断功能

String类提供了matches()判定字符串是否匹配给定的正则表达式。
比如验证用户输入的邮箱是否合法?

public class Test {

	public static void main(String[] args) {
		// 不考虑@符号前字符个数限制的问题
		// magic@163.com
		// hello@vip.sina.com
		// 123ak48@yeah.net
		// 981075006@qq.com

		// 测试邮箱
		String email = "magic@163.com";
		// 规则
	    String regex = "[a-zA-Z_0-9]+@([a-zA-Z_0-9]{2,4}\\.)+[a-zA-Z]{3}";
		//String regex = "\\w+@(\\w{2,4}\\.)+[a-zA-Z]{3}";//可以替换为这个
		// 判定
		boolean b = email.matches(regex);
		System.out.println(b);// true

		//由于@字符后magic串长度不符合{2,4}至少 2 次,但是不超过 4次规则,所以返回false 
		String email2 = "hello123@magic.com";
		boolean b2 = email2.matches(regex);
		System.out.println(b2);// false
	}
}

注:一般可以将邮箱分为四个部分[用户申请名][@符号][二级域名部分.][顶级域名部分],上面测试邮箱中,用户申请名包含纯字符,纯数字,字符数字混合统一来说就是字符 所以用[a-zA-Z_0-9]代替,后面的+是(X+ X,一次或多次 )代表字符个数; @符号是唯一的所以只写@,后面未标识数量默认是一; 二级域名部分163. yeah. qq. vip.字符长度最小为2,最大为4,所以为\w{2,4}\. 但是由于vip.后面多了个sina.所以\w{2,4}\.这个匹配数量为 一次或多次为([a-zA-Z_0-9]{2,4}\.)+;顶级域名部分为com com net com 都是字符且字符数量都是3,所以为[a-zA-Z]{3}。

2.分割功能

String类提供了split()根据给定正则表达式的匹配拆分此字符串。
比如获取Url的传输协议是https还是http?

		//url
		String url = "http://www.baidu.com";
		String url = "https://www.tmall.com";
		//指定分割规则,返回字符串数组
		String[] strs = url.split("://");
		System.out.println(strs[0]);// http
		System.out.println(strs[1]);// www.baidu.com

3.替换功能

String类提供了replace()替换此字符串所有匹配给定的正则表达式的子字符串。

//newChar 替换此字符串中出现的所有 oldChar
String replace(char oldChar, char newChar)
//字面值替换序列替换此字符串所有匹配字面值目标序列的子字符串
String replace(CharSequence target, CharSequence replacement)
//replacement 替换此字符串所有匹配给定的正则表达式的子字符串
String replaceAll(String regex, String replacement)
// replacement 替换此字符串匹配给定的正则表达式第一个子字符串
String replaceFirst(String regex, String replacement)

比如替换字符串中的双11.11为*?

        //测试字符串、替换掉字符串中的双11
		String s="Sea surface Ch11.11oudai focusing ,wa11.11rm spring flo11.11wers.";
		//替换规则
		String regex3="\\d+\\.\\d+";//表示0-9的数字出现一次或多次 (.) 0-9的数字出现一次或多次 
		//参数指定替换后的字符
		String ss=s.replaceAll(regex3,"*");
		System.out.println(ss);//Sea surface Ch*oudai focusing , wa*rm spring flo*wers. 

4.获取功能

获取功能需要模式对象Pattern类和匹配对象Matcher共同完成。
比如获取字符串中为两位数字的数据?

	    // 测试字符串数据
		String s = "Sea surface Ch11.11oudai focusing , wa11.11rm spring flo11.11wers. ";
		// 规则
		String regex4 = "\\d{2}";//表示0-9的数字出现2次
		// 生成模式对象
		Pattern pattern = Pattern.compile(regex4);
		// 生成匹配对象
		Matcher matcher = pattern.matcher(s);
		while (matcher.find()) {
			String ss = matcher.group();
			System.out.print(ss + " ");
		}
		// 最终输出 11 11 11 11 11 11

注:正则表达式基本使用就这些,不需要记,如果用到了查查API即可!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值