Java 正则表达式

正则表达式简单介绍,校验QQ号
  
  正则表达式是用于字符串的处理工具,超级强大.通过正则表达式可以对文本内容进行查找,替换,分割等操作. 简化对字符串的复杂操作
  
  好处:可以简化字符串的复杂操作
  弊端:符号定义越多,正则越长,阅读性极差
  
  具有操作功能:
    1.匹配:用String matches()方法匹配整个字符串,只要有1处不符合,就返回false
    2.切割:String split()

    3.替换:String replaceAll()

    4.获取

  
  预定义字符类 
. 任何字符(与行结束符可能匹配也可能不匹配) 
\d 数字:[0-9] 
\D 非数字: [^0-9] 
\s 空白字符:[ \t\n\x0B\f\r] 
\S 非空白字符:[^\s] 
\w 单词字符:[a-zA-Z_0-9] 

\W 非单词字符:[^\w] 

Greedy 数量词 
X? X,一次或一次也没有 
X X,零次或多次 
X+ X,一次或多次 
X{n} X,恰好 n 次 
X{n,} X,至少 n 次 
X{n,m} X,至少 n 次,但是不超过 m 次 


       为了可以让规则的结果被重用,可以将规则封装成组,用小括号完成,组的出现都有编号,

       从1开始,想要使用已有的组,可以通过\n(n就是组的编号)的形式来获取

public class RegexDemo01 {

	public static void main(String[] args) {
		//demo();
		//checkEmail();
		//checkQQ();
		//checkTel();
		//splitDemo();
		
		replaceAllDemo();
	}

	//替换字符串
	public static void replaceAllDemo(){
		
		//要求,将字符串中的数字替换成#
		/*String str = "nby3hjkjdhsajkdgahkfajkbmcuey6783264329grbhwkegy369123eqbdu";
		String reg = "\\d{5,}";   //连续超过5个的,数字(\d)
		String newStr = "#";*/
		
		//要求:将叠词替换成$号  将重叠的字母替换成单个字母aaaa->a
		String str = "dasfaaaafdsgsgggggggggggggregtr";
		String reg = "(.)\\1+";   //组,重复出现1次或多次
		String newStr = "$1\\$";    //替换成$,则需要转义字符来弄一下  $可以获取前面的正则表达式中组的信息,1表示第1组,而第1组刚好是叠词的第一个字母,
		str = str.replaceAll(reg, newStr);  //使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串
		System.out.println(str);
	}
	
	//切割字符串
	public static void splitDemo(){
		//String str = "zhangsan     lisi     wangwu";
		//String reg = " +";   //空格出现一次或多次   按照多个空格进行切割
		
		//String str = "zhangsan.lisi.wangwu";
		//String reg = "\\.";   //这里需要用转义字符\来弄一下     因为单独的.  表示任意字符
		
		//String str = "c:\\abc\\a.txt";  //  将按照\\切割的字符串
		//String reg = "\\\\";  //这里设置的规则是\\
		
		String str = "dasfaaaafdsgsgggggggggggggregtr";   //  将按照叠词(eg:aa,gg)切割的字符串
		//第一个位置是任意字符,第二位拿的是第一位的结果  按照叠词完成切割,为了可以让规则的结果被重用,
		//可以将规则封装成组,用小括号完成
		String reg = "(.)\\1+";   //组,前面一个组,重复一次或多次   即代表重叠,    "(.)\\1":重复一组
		String[] arr = str.split(reg);
		
		System.out.println(arr.length);   //数组长度
		for(String a : arr){
			System.out.println(a);
		}
	}
	
	
	//校验手机号  手机号段只有13XXX 15XXX 18XXX 
	public static void checkTel(){
		String tel = "15482027845";
		String regex = "1[358]\\d{9}";  //第一位是1,第二位是3,5,8,后面的全是数字,共11位
		Boolean flag = tel.matches(regex); // 利用正则表达式,看是否符合格式
		if (flag) {
			System.out.println("Tel: " + tel);
		} else {
			System.out.println("格式错误");
		}
	}
	
	//校验QQ号,5-15位,全是数字,不能以0开始
	public static void checkQQ(){
		String qq = "123456789012345";
		String regex = "[1-9]\\d{4,14}"; // 第1位是1-9的数字,第二位是0-9的数字,且第二位可以有4-14个
		Boolean flag = qq.matches(regex); // 利用正则表达式,看是否符合格式
		if (flag) {
			System.out.println("qq: " + qq);
		} else {
			System.out.println("格式错误");
		}
	}

	
	//[a-z&&[^bc]]:a-z的字母,除了b和c
	public static void demo() {
		String str = "13432532";
		//String reg = "[bcd]";   //这一位置,只能是bcd中的其中一个   这个字符串只能有1个字符
		
		//3个位置,第一个位置是非a的任何字符,第二个是bcd中的其中一个,第三个位置是A-z的其中一个小写字母,大写字母
		//String reg = "[^a][bcd][a-zA-Z]";  
		
		String reg = "\\d{4,}";  // \代表后面有特殊符号,\d表示0-9的数字
		Boolean b = str.matches(reg);
		System.out.println(b);
	}

}

下面是获取的代码:

public class RegexDemo02 {

	public static void main(String[] args) {
		//getDemo();
		getDemo2();
	}

	public static void getDemo(){
		//获取连续3个字母组成的单词
		String str = "ming tian jiu yao fang jia la, da jia .";
		String reg = "\\b[a-z]{3}\\b";
		
		//将规则封装成对象
		Pattern p = Pattern.compile(reg);   //无构造函数,通过静态方法返回已封装好的Pattern对象
		
		//让正则对象和要作用的字符串相关联   获取匹配器引擎
		Matcher m = p.matcher(str);   //Matcher:通过解释 Pattern 对 character sequence 执行匹配操作的引擎。
		//其实String类中的matcher()方法用的就是Pattern和Matcher来完成的,只不过用String方法封装过,用起来简单一些.
		
		while(m.find()){  //通过引擎对符合规则的字串进行操作  find():尝试查找与该模式匹配的输入序列的下一个子序列
			System.out.println(m.group());  //group()用于获取匹配后 的结果 ,返回由以前匹配操作所匹配的输入子序列。
			
			//Matcher :start()返回以前匹配的初始索引
			//Matcher :end()返回最后匹配字符之后的偏移量
			System.out.println(m.start()+"........"+m.end());  //包含头,不包含尾
		}
		
	}
}

下面是对于正则表达式的练习:

/**
 * 2016年7月31日19:05:16
 * 需求:
 * 将下列字符串转成:我要学编程
 * 将ip地址进行地址段顺序的排序	
 * 对邮件地址进行校验
 * 
 * @author XFHY
 * 到底用四种功能中的哪一个?或者哪几个呢?
 * 思路方式:
 * 1,如果只想知道该字符是否有错,使用匹配
 * 2,想要将已有的字符串变成另一个字符串,替换
 * 3,想要按照自定的方式将字符串变成多个字符串,切割
 * 4,想要拿到符合要求的字符串,获取
 */
public class RegexTest01 {

	public static void main(String[] args) {
		String str = "我....我我....要要..要....要..要要要....要...学...学....学.学学学学...编...编编编.....程";
		//test(str);
		//test2(str);
		//ipSort();
		checkMail();
	}
	
	public static void test(String str){
		//我觉得应该使用获取
		String reg = "([^.])";  //去掉.
		Pattern p = Pattern.compile(reg);   //封装规则
		Matcher m = p.matcher(str);    //获取引擎
		
		StringBuilder temp = new StringBuilder();
		
		while(m.find()){   //找到符合要求的子串
			System.out.print(m.group());   //返回之前找到的符合要求的子串
			temp.append(str.substring(m.start(), m.end()));  //添加获取到的字符串到temp
		}
		System.out.println();
		//System.out.println(temp);   //现在得到了字符串"我我我我我我要要要要要要要要学学学学学学学编编编编程"
		
		str = temp.toString();   //将上面提取出来的字符串转成String类型
		reg = "(.)\\1+";         //规则:任何字符出现了1次或多次,这是组
		String newStr = "$1";    //将先前找到的字串替换成第一组
		str = str.replaceAll(reg, newStr);   //规则,替换的原数据
		System.out.println(str);
	}

	/*
	 * 192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30
	 * 
	 * 将ip地址进行地址段顺序的排序	
	 * 
	 * 还按照字符串自然排序,只要让它们每一段都是3位即可
	 * 1,按照每一段需要的最多的0补齐,那么每一段	就会至少保证有3位
	 * 2,将每一段只保留3位,这样,所有的ip地址都是每一段3位
	 * */
	public static void ipSort(){
		String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
		
		ip = ip.replaceAll("(\\d+)", "00$1"); //规则:数字出现了1次或多次,组    00+原来的每一段
		System.out.println(ip);
		
		ip = ip.replaceAll("0*(\\d{3})","$1");  //规则:0出现了0次或多次,组    保存原来的1组
		System.out.println(ip);
		
		String[] arr = ip.split("[ ]");  //根据空格将每个ip地址分割出来
		//Arrays.sort(arr);   //自然排序
		//for (int i = 0; i < arr.length; i++) {
			//System.out.println(arr[i]);
		//}
		TreeSet<String> ts = new TreeSet<String>();  //TreeSet本来就是有序的,添加进去就是有序的,就不用排序了
		for(String s : arr){//添加到TreeSet集合
			ts.add(s);
		}
		for(String s : ts){ //遍历TreeSet集合
			System.out.println(s.replaceAll("0*(\\d+)", "$1"));
		}
	}
	
	/*
	 * 需求:对邮件地址进行校验
	 * */
	public static void checkMail(){
		String mail = "abc12@sina.com.cn";
		//@是固定的  名字是1次或多次    公司名1次或多次   后面的域名可能是.com或者.cn或者.com.cn,域名字母可能是1个或多个,域名最多3级,重复1次到3次,这个组
		//这里是相对精确的匹配
		String reg = "[0-9a-zA-Z_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+){1,3}";  
		System.out.println(mail.matches(reg));  //输出是否对
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值