Java基础:正则表达式

       事先定义好的一些字符的组合,构成“规则字符串”,用来表达对字符串的一种过滤逻辑

语法:[abc]表示匹配a或者b或者c的字符

 [^abc]表示匹配不是a或者b或者c的字符

  [a-z]在中括号里面的-表示范围,如需匹配短横线,则需在后面再加-,如[0-9-]

 . 点匹配除了缩进换行符以外的任何字符

\d 匹配数字

\s匹配任何空白字符

 \w匹配包括下划线的任何单词字符和数字

边界:^ $ 为起始边界

量词:? 匹配0个或1个

+ 匹配 >=1 个

* 匹配任意多个

{n,m} n为最少,m为最多

 {n},则为精确匹配

 {n,},则匹配大于n个

匹配模式:默认的匹配模式是贪婪模式(即尽可能多的匹配)若想将贪婪模式改成“非贪婪模式”,只需在量词后面加上“ ? ”

1、匹配用户名:
    a)字母、数字、中横线、下划线组成。
    b)长度6到8位
    c)必须字母开头

正确数据:
zeng-234
z123_-67
L1234567
^[a-zA-Z][\w-]{6,8}$


2、匹配手机号
    a)开头必须是13或15或18
    b)长度11位
    
正确数据:
13566667777
15888887777
^(1[358])\d{9}$


3、匹配电话号码(区号-电话号码)
    a)区号以0开头,3到4位
    b)区号和电话号码之间有中横线'-'
    c)电话号码7-8位
    d)区号和-可以省略不写
    
正确数据:
028-66667777
0817-7776666
85041591
(^0\d{2,3}-?)\d{7,8}$


4、电子邮件地址验证
    a)格式:用户@地址;
    b)用户:字母数字下划线组成
    c)地址:字母和和数字小数点组成

正确数据:
12580@qq.com
9090990@vip.qq.com
7474741@sina.com.cn
yanfen@163.com
madong@gmail.com

^(\w+)[@][a-zA-Z\d/.]+$

5、身份证
a)15或18位身份证
b)第一位是1-9的数字
c)18位的身份证最后一位可以是数字或x或X
正确数据:
123456789012345
123456789012344
123456789012345678
12345678901234567x
12345678901234567X
^[1-9][(\d{14}$)(\d{16}[xX]$)]
package com.cdsxt.day22.regex;

import java.util.regex.Pattern;

public class Test1 {
	/*
	 * 测试正则表达式的验证
	 * 
	 * 需求:邮箱验证:格式:用户名@运营商.后缀(com|cn|com.cn)
	 * 	1、用户名部分:字母开头,长度为6到18,可以是字母、数字、下划线构成。
	 * 	2、运营商部分:数字字母构成,长度为2到8位
	 * 	3、后缀:com|cn|com.cn
	 */
	public static void main(String[] args) {
		volideEmail("lisi123@sina.com.edu");	
	}
	//验证邮箱地址
	public static void volideEmail(String email) {
		//使用正则表达式来验证邮箱
		//定义正则表达式
		String regex = "^[a-zA-Z]\\w{5,17}@[a-zA-Z0-9]{2,8}\\.(com|cn|com\\.cn)$";
		//进行验证
		boolean r = Pattern.matches(regex, email);
		System.out.println("邮箱验证:"+(r?"成功":"失败"));
	}
}
package com.cdsxt.day22.regex;

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

public class Test2 {
	/*
	 * Pattern 类的常用方法:
			- matches(String regex, CharSequence input):判断一个字符串是否符合正则表达式的规则
			- compile(String regex):接受正则表达式,返回与之对应的Pattern对象
			- split(CharSequence input, int limit):第二个形参limit,
			   - 当limit小于1或者大于最大的分割结果数,没有影响
			   - 其他情况下,最终的数组长度等于limit,从第一个正则表达式开始分割,限制分割的次数
			- matcher(CharSequence input):接受字符串并返回Matcher对象
		Matcher类的常用方法:
			 - find(): 查找有无下一个匹配正则表达式的子序列
			 - find(int start): 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
			 - String group():返回由以前匹配操作所匹配的输入子序列。 
		     - String group(int group):返回在以前匹配操作期间由给定组捕获的输入子序列,一个括号为一组。
			 - groupCount():获取总共捕获的组数
			 - lookingAt():从字符串开始位置匹配第一个子序列

	 */
	public static void main(String[] args) {
		test2();
	}
	//测试 Pattern 类的常用方法:
	private static void test1() {
		//matches(String regex, CharSequence input):判断一个字符串是否符合正则表达式的规则
		//验证手机号
		String regex1 = "^1[358]\\d{9}$";
		//验证
		boolean r1 = Pattern.matches(regex1, "13500001111");
		System.out.println("验证:"+r1);
		//compile(String regex):接受正则表达式,返回与之对应的Pattern对象
		Pattern pattern  = Pattern.compile(regex1);
		//字符串的拆分
		String str1 = "薛之谦_上海-男_35岁";
		String[] strs = str1.split("[-_]", 3);
		System.out.println(Arrays.toString(strs));
		//split(CharSequence input, int limit):第二个形参limit,
		Pattern p2 = Pattern.compile("[-_]");
		//拆分
		strs = p2.split(str1);
		System.out.println(Arrays.toString(strs));
		//matcher(CharSequence input):接受字符串并返回Matcher对象
		Matcher matcher = p2.matcher(str1);
	}
	//测试Matcher类的常用方法:
	public  static void test2() {
		//检索邮箱地址
		//定义正则表达式
		String regex = "([a-zA-Z]\\w{3,17})@([a-zA-Z0-9]{2,8})\\.(com|cn|com\\.cn)";
		//创建正则表达式对象
		Pattern pattern = Pattern.compile(regex);
		//创建包含邮箱地址的一些字符串数据
		String data = "user:zhangsan;age:18;email:zhangsan@sina.com;lisi;age:20;email:lisi@qq.com;user:wangwu;age:22;email:wangwu@163.com;";
		//获取matcher对象
		Matcher matcher = pattern.matcher(data);
		//find(): 查找有无下一个匹配正则表达式的子序列
		/*boolean r = matcher.find();
		if(r) {
			//String group():返回由以前匹配操作所匹配的输入子序列。 
			String  email = matcher.group();
			System.out.println(email);
		}*/
		while(matcher.find()) {
			//获取匹配到的内容
			String email = matcher.group();
			System.out.println(email);
			System.out.println(matcher.group(0));
			System.out.println(matcher.group(1));
			System.out.println(matcher.group(2));
			System.out.println(matcher.group(3));
		}
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值