正则表达式的用法及手机号码Email地址是否合法身份证号码是否合法邮政编码

本文详细介绍了正则表达式的基本概念、常用表达式和应用场景,包括匹配、替换、分隔等操作。同时,通过Java中的String方法和Pattern、Matcher类展示了正则在实际编程中的运用,如手机号码验证、数字匹配和HTML内容清理。此外,还提供了多个示例代码以加深理解。
摘要由CSDN通过智能技术生成

正则表达式

(1)正则表达式概念:

​ 正则表达式(regular expression)描述了一种字符串 -regex
​ 匹配的模式,可以用来:校验

 (a)检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串;
 (b)根据匹配规则对字符串进行灵活的替换操作。

(2)常见表达式:

[a]   :匹配a这个字符  当一个字符时[]可以省略
[abc] :匹配a,b,c中的任意字符   abc
[0-9] :匹配0-9中的一个数字  

[a-z] :匹配26个英文小写字母 
[A-Z] :匹配26个英文大写字母

[a-zA-Z]:匹配26个英文字母
[a-zA-Z0-9]:英数(英文 数字)
[a-zA-Z0-9_] : 匹配单词字母(匹配字母,数字,下划线)

\d    :匹配0-9中的一个数字
\w : 匹配单词字母(匹配字母,数字,下划线)
\D : 匹配非数字字母
\W : 匹配非单词字母
\s : 匹配空白字符(空格,换行,tab制表符)

. 匹配任意字符

?:最多出现一次
+:至少出现一次 
*:可出现任意次数   

|左右两边表达式之间 "或" 关系。

{n} :代表出现n次   
{n,}:代表出现至少N次 a{3,}   
{n, m}:代表最少出现n次,最多出现m次

^ :①如果出现在正则表达式的第一个字符上,
     代表以...开头,   
   ②、否则代表非
$ : 代表以...结尾


​ () 是为了提取匹配的字符串。表达式中有几个()就有几个相应的匹配字符串。
​ []是定义匹配的字符范围。比如 [a-zA-Z0-9] 表示相应位置的字符要匹配英文字符和数字
​ {}一般用来表示匹配的长度,比如 \s{3} 表示匹配三个空格,\s[1,3]表示匹配一到三个空格。

(3)应用:

​ a.String中方法
​ 1.replaceAll(String regex)
​ 2.split(String regex)
​ 3.matches(String regex) 告知此字符串是否匹配给定的正则表达式。 (String reg) 返回布尔类型
​ b.专门用作正则表达式的API类
​ Pattern pattern = Pattern.compile(regex);
​ Matcher match = p.matcher(str);
​ while(match.find()){// 代表发现匹配的元素
​ String content = m.group();// 获取正则表达式匹配的内容

(4)案例:


	@Test
	public void test_replaceAll(){
		String str = "123 abc444a111";
		str = str.replaceAll("abc.*", "abc efg");
		System.out.println(str);
		
	}
	@Test
	public void test_replace(){
		String str = "123 abc444a111abc";
		str = str.replace("abc.*", "abc efg");// replace注意参数不是正则表达式
		System.out.println(str);
		
	}
	
	@Test
	public void test_split(){
		//使用regex进行字符串切割称为模式匹配
		String str = "abcd1aaaa3sss5";
		System.out.println(Arrays.toString(str.split("\\d")));//例如以数字作为分隔符
	}
    @Test
	public void test_split_2(){
		String filePath = "E:\\a\\b.txt";
		System.out.println(Arrays.toString(filePath.split("\\\\")));//java中\\ 表示\ 而正则中\\也表示\,所以\\\\解析为\\

	}
	
	/**
	 * 例如:校验是否是数字
	 */
	@Test
	public void test_match1(){
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数字:");
		String inputStr = sc.nextLine();
		if(!inputStr.matches("\\d*")){// 判断单个字符是否是数字用\d 多个字符可以考虑任意次数*
			System.out.println("您输入的不是数字。");
			return;
		}
		
		int num = Integer.parseInt(inputStr);
		System.out.println("您输入的是数字可以进行数字业务操作");
	}
	
	/**
	 * 例如:校验是否是数字然后以逗号分隔
	 */
	@Test
	public void test_match2(){
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一组数字逗号分隔:");
		String inputStr = sc.nextLine();
		if(!inputStr.matches("\\d+(,\\d+)*")){// 判断单个字符是否是数字用\d 多个字符可以考虑任意次数\d*
			System.out.println("您输入的格式不对或包含非数字,请输入一组数字按照逗号分隔。");
			return;
		}
		
		System.out.println(Arrays.toString(inputStr.split(",")));
	}
	
	@Test
	/**
	 *  手机号码验证"^1[3|4|5|7|8][0-9]{9}$“
	 *  
	 */
	public void test2(){
		String telNum = "15936270517";
		String regex = "^1[3|4|5|7|8][0-9]{9}$";
		if(!telNum.matches(regex)){
			System.out.println("非手机号");
		}else {
			System.out.println("手机号正常");
		}
		
	}
	
	/**
	 * 匹配如下满足连续11位数字的数字
	 */
	@Test
	public void test3(){
		String str = "15936270517abcd3333ff15936270516";
		String regex = "\\d{11}";
		System.out.println("\t");
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		while(matcher.find()){//匹配,是否找到
			String num = matcher.group();// 获取匹配的子字符串
			System.out.println(num);
		}
	}
	@Test
	/**
	 * html文本内容
	 */
	public void test4(){
		String html = "<p>你好</p>中国</br>";
		String regex = "<[^>]+>";
		html = html.replaceAll(regex, "");
		System.out.println(html);
	}
@Test
	public void test1(){
		String str = "hello world,are you OK? world,world is OK world, world";
		String subStr = "world";
		int count=0;
		int index =0;
		while((index=str.indexOf(subStr))!=-1){
			count++;
			str =str.substring(index+subStr.length()-1);
			
		}
		System.out.println(count);
	}
	
	@Test
	public void test2(){
		String str = "hello world,are you OK? world,world is OK world, world";
		String regex="world";
		int count=0;
		Pattern pattern = Pattern.compile(regex);
		Matcher matcher = pattern.matcher(str);
		while(matcher.find()){
			count++;
		}
		System.out.println(count);
	}
	

(5)特殊需求

例如:

  • Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*$
  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+.?
  • 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|4|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  • 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  • 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈先森的日志

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

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

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

打赏作者

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

抵扣说明:

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

余额充值