正则表达式RegularExpressions

RegularExpressions    字符串处理利器


用途:

字符串匹配(字符匹配)

字符串查找

字符串替换


例如

IP地址是否正确

从网页揪出email地址

从网页揪出链接等


类:

Java.lang.String

Java.util.regex.Pattern 有关于正则表达式的构造

Java.util.regex.Matcher

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

public class Test {

	public static void main(String[] args) {
		//简单认识正则表达式概念
		p("ab1".matches("..."));            //"."表示任何一个字符             true
		p("a3465b".replaceAll("\\d","_")); //"\d"表示一位数字前面的"\"表示转义字符        a____b
		
		Pattern p=Pattern.compile("[a-z]{3}");  //匹配a-z的字符三个
		Matcher m=p.matcher("fgh");
		p(m.matches());                                       //true
		
		p("fgh".matches("[a-z]{3}"));  //效果相当于上面三行                 true
		
		/*初步认识"."" *"" +" (MetaCharacter)
		 * "."表示一个任何的字符
		 * "*"表示0个或多个
		 * "+"表示1个或多个
		 * "?"表示0个或1个
		 */
		p(" ");
		p("aa".matches("."));            //false
		p("aa".matches("a*"));           //true
		p("aa".matches("a+"));            //true
		p("aa".matches("a?"));           //false
		p("123.".matches("\\d{1,3}\\."));   //1-3个数字,一个.号     true  
		p("192".matches("[0-2][0-9][0-9]"));           //true
		
		//范围"[]"
		p(" ");
		p("a".matches("[abc]"));           //abc中的一个     true
		p("a".matches("[^abc]"));          //除abc外            false
		p("a".matches("[a-zA-Z]"));        //a-z或A-Z    true
		p("a".matches("[a-z]|[A-Z]"));     //a-z或A-Z     true
		p("a".matches("[a-z[A-Z]]"));      //a-z或A-Z    true
		p("r".matches("[a-z]&&[rfgh]"));   //且                         false
		
		/*预定义字符类"\s""\d""\w""\"	
        \d	数字:[0-9]
        \D	非数字: [^0-9]
        \s	空白字符:[ \t\n\x0B\f\r]
        \S	非空白字符:[^\s]
        \w	单词字符:[a-zA-Z_0-9]
        \W	非单词字符:[^\w]
        */
		p(" ");
		p(" \n\r\t".matches("\\s{4}"));            //true
		p(" ".matches("\\S"));                    //false
		p("q_4".matches("\\w{3}"));               //true
		p("qwe333*&%".matches("[a-z]{3}\\d+[&*%]+"));   //true
		p("\\".matches("\\\\"));   //匹配一个\             true
		
		//POSIX Style
		p(" ");
		p("a".matches("\\p{Lower}"));             //true
		
		/*边界匹配器boundary
		   ^	行的开头
           $	行的结尾
           \b	单词边界
           \B	非单词边界
		 */
		p(" ");
		p("hello sir".matches("^h.*"));                    //true
		p("hello sir".matches(".*ir$"));                   //true
		p("hello sir".matches("^h[a-z]{3}o\\b.*"));         //true
		p("hellosir".matches("^h[a-z]{3}o\\b.*"));          //false
		
		//whilte lines
		p(" ");
		p(" \n".matches("^[\\s&&[^\\n]]*\\n$"));          //true
		
		p(" ");
		p("aaa 8888a".matches(".*\\d{4}."));            //true
		p("aaa 8888a".matches(".*\\b\\d{4}."));         //true
		p("aaa8888a".matches(".*\\d{4}."));              //true
		p("aaa8888a".matches(".*\\b\\d{4}."));            //false
		
		//email
		p("");
		p("asdfgh@aa.com".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));   //true
		
		//matches find lookingAt
		p("");
		Pattern p1=Pattern.compile("\\d{3,5}");
		String s="13-45312-134-11";
		Matcher m1=p1.matcher(s);
		p(m1.matches());    //匹配整个字符串matches()会影响到find()   false
		m1.reset();         //从头开始读,消除matches()的影响
		
		p(m1.find());       //尝试查找与该模式匹配的下一个子序列    true
		p(m1.start()+"-"+m1.end());  //3-8    匹配的起始位置到结束位置的下一个(左闭右开)
		p(m1.find());          //true
		p(m1.start()+"-"+m1.end()); //9-12
		p(m1.find());          //false
		p(m1.find());          //false
		
		p("");
		p(m1.lookingAt());     //每次都从开头匹配子序列    false
		//p(m1.start()+"-"+m1.end());    不匹配的会报错
		p(m1.lookingAt());      //false
		p(m1.lookingAt());      //false
		p(m1.lookingAt());      //false
		
		//replacement
		p("");
		Pattern p2 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);  //大小写不敏感
		Matcher m2 = p2.matcher("java JaVa JAvA thinking in JAVA Javabean asdre");
		while(m2.find()) {
			p(m2.group());      //返回匹配的子序列
		}
		p(m2.replaceAll("JAVA"));   //将所有类型的java替换成JAVA
		/*
java
JaVa
JAvA
JAVA
Java
JAVA JAVA JAVA thinking in JAVA JAVAbean
		 */
		
		//双数位置出现用JAVA替换,单数位置用java替换
		p(" ");
		StringBuffer buf = new StringBuffer();
		int i=0;
		m2.reset();
		while(m2.find()) {
			i++;
			if(i%2 == 0) {
				m2.appendReplacement(buf, "java");
			}else {
				m2.appendReplacement(buf, "JAVA");
			}
		}
		m2.appendTail(buf);     //把后面一串尾巴添加到buf后
		p(buf);             
		//     JAVA java JAVA thinking in java JAVAbean asdre
		
		//group
		p("");
		Pattern p3 = Pattern.compile("(\\d{3,5})([a-z]{2})");//由两个()分为两组
		String s3  = "123qq-23456aa-234cc-oo";
		Matcher m3 = p3.matcher(s3);
		while(m3.find()) {
			p(m3.group(1));  //将每个匹配的子序列的第一组输出
		}
		/*
123
23456
234
		 */
		//qulifiers(了解即可)
		p("");
		Pattern p4 = Pattern.compile("(.{3,10})[0-9]");
		Matcher m4 = p4.matcher("aaaa5ssss5");
		if(m4.find()) {
			p(m4.start()+"-"+m4.end());  //Greedy形式一次性读取十个再吐出    0-10
			/*reluctant形式:X*?	X,零次或多次
			 * Pattern p4 = Pattern.compile("(.{3,10}?)[0-9]");
			 * 先读取3个试试,不行再读
			 * 则输出0-5
			 * 
			 * Possessive形式:X*+	X,零次或多次
			 * Pattern p4 = Pattern.compile("(.{3,10}+)[0-9]");
			 * 一次性读取10个不吐出
			 * 则输出不匹配
			 * */
		}else {
			p("not match!");
		}
		
		//non-capturing groups 非捕获组  (了解即可)
		p("");
		Pattern p5 = Pattern.compile(".{3}(?=a)");//有三个字符,第四个是a(但不捕获a)
		String s5 = "123a516b";
		Matcher m5 = p5.matcher(s5);
		while(m5.find()) {
			p(m5.group());   //123  没有捕获a
		}
		
		//back refenrence 向前引用
		p("");
		Pattern p6 = Pattern.compile("(\\d(\\d))\\2");  //  \\2表示引用第二个组的匹配
		Matcher m6 = p6.matcher("122");
		p(m6.matches());                     //true
		
		//flags的简写
		p("");
		//Pattern p7 = Pattern.compile("java",Pattern.CASE_INSENSITIVE);
		p("Java".matches("(?i)java"));          //等同于上面的写法   true
	}
	public  static void p(Object o) {
		System.out.println(o);
	}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值