正则表达式 java

正则表达式介绍
  • 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
  • 作用:比如注册邮箱,邮箱有用户名和密码
  • 位于:java.util.regex
正则表达式的利用
  • String类中有一 matches()方法 用于告知此字符串是否匹配给定的正则表达式 如果匹配返回 true 反之 返回 false
String regex = "[1-9]\\d{4,14}";//先不用理解 等下讲解
"1234567".matches(regex);//true
正则表达式的字符 限制类
  • 中括号的单个字符**[ ]**
  • [abc] a、b 或 c(简单类)
  • [^abc] 任何字符,除了 a、b 或 c(否定)
  • [a-zA-Z] a到 z 或 A到 Z [包含头包含尾]
  • [a-d[m-p]] a到d或者m到p(不写就是**||**取并集)
  • [a-z&&[def]] 和它做交集 得到d、e 或 f 在a-z中而且在def中
  • [a-z&&[^bc]] a- z 除了 b和c
  • [a-z&&[^m-p]] 在a-z中,除了m-p
正则表达式 的预定义字符类
  • . 任意字符
  • … 两个任意字符
    *都是指单个字符而且都是反斜杠*
  • \d 0到9的字符都包括任意 但是要注意的是**\是转义字符**[0-9]
  • \D 非数字[^0-9]
  • \s 空白字符:[ \t\n\x0B\f\r]
  • \S 非空白字符
  • \w 单词字符[a-zA-Z_0-9]这里数字也是可以的(数字和字母(大小写))
  • \W 非单词字符
正则表达式的数量词Greedy
  • X? X 有一次或一次也没有
	String regex = "[abc]?";
	System.out.println("a".matches(regex));//true	 	只出现了1次(正确)
	System.out.println("ab".matches(regex));//false	出现了2次
	System.out.println("abc".matches(regex));//false  出现了三次
	System.out.println("abca".matches(regex));//false	出现了四次
	System.out.println("abcabc".matches(regex));//false 	出现了6次
	System.out.println("".matches(regex));//true		一次也没有(正确)
	System.out.println("f2".matches(regex));//false一次也没有但出现了其他字符(错误)
	System.out.println("af".matches(regex));//false 出现了1一次但出现了其他字符
	//总结:出现1次或没有出现是指abc三个任意一出现,而不是都出现,没有出现是"",而不是出现
	//了其他字符
  • X* X有零次或多次
	String regex = "[abc]*";
	System.out.println("a".matches(regex));//true	 	只出现了1次(1次也是多次)
	System.out.println("ab".matches(regex));//true	出现了多次
	System.out.println("abc".matches(regex));//true  出现多次
	System.out.println("abca".matches(regex));//true	出现了四次 (多次)
	System.out.println("abcabc".matches(regex));//true 	出现了6次(多次)
	System.out.println("".matches(regex));//true		一次也没有出现
	System.out.println("f2".matches(regex));//false 一次也没有但出现了其他字符(错误)
	System.out.println("af".matches(regex));//false 出现了但出现了其他字符
	//总结:出现0次或多次是指abc三个任意一出现,或者 "" 都是对,但是只要是出现了
	//其他字符就是错误
  • X+ X有一次或多次
	String regex = "[abc]+";
	System.out.println("a".matches(regex));//true	 	只出现了1次(1次也是多次)
	System.out.println("ab".matches(regex));//true	出现了多次
	System.out.println("abc".matches(regex));//true  出现多次
	System.out.println("abca".matches(regex));//true	出现了四次 (多次)
	System.out.println("abcabc".matches(regex));//true 	出现了6次(多次)
	System.out.println("".matches(regex));//false		一次也没有出现
	System.out.println("f2".matches(regex));//false 一次也没有但出现了其他字符(错误)
	System.out.println("af".matches(regex));//false 出现了但出现了其他字符
	//总结:出现1次或多次是指abc三个任意一出现就是对,但是只要是出现了
	//其他字符或者出现只有""(空)就是错误
  • X{n} X恰好有n次
	String regex = "[abc]{3}";
	System.out.println("a".matches(regex));//false	 	只出现了1次(1次也是多次)
	System.out.println("ab".matches(regex));//false	出现了多次
	System.out.println("abc".matches(regex));//true  出现多次
	System.out.println("abca".matches(regex));//false	出现了四次 (多次)
	System.out.println("abcabc".matches(regex));//false 	出现了6次(多次)
	System.out.println("".matches(regex));//false		一次也没有出现
	System.out.println("f2".matches(regex));//false一次也没有但出现了其他字符(错误)
	System.out.println("af".matches(regex));//false 出现了但出现了其他字符
	//总结:恰好有n次出现是指abc三个任意一出现总数为3次就是对,但是只要是出现了
	//其他字符也是错误。换种说法:只要出现其他字符肯定错,出现只有""也错,就算只出现abc
	//也要保证只有3次

  • X{n,} X至少有n次
		//和上面类似
  • X{n,m} X 至少n次,但不超过m次
		//和上面类似
正则表达式的分割功能
  • 使用String类中的函数split()方法
String str  = "i love java , i love China .";
String [] arr = str.split(" ");
//返回的是arr[0] == i;arr[1] == love 以此类推

//注意我们不能用**.**来分割,.代表的是任意字符,切出来数组将不会存在
正则表达式的替换功能
  • 使用String中的replaceAll(String regex,String replacement)
    regex 正则表达式规定的内容,替换为replacement
// public String replaceAll(String regex,String replacement)
String str  = "i love java , i love China .";
String regex = "\\s";
String str2 = str.replaceAll(regex,"*");
System.out.println(str2);//i*love*java*,*i*love*China*.
正则表达式的分组功能

捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B©)) 中,存在四个这样的组:

1 ((A)(B©))
2 (A
3 (B©)
4 ©

组零始终代表整个表达式。

String s = "我我....我...我.要...要要...要学....学学..学.习习习..习";
String s1 = s.replaceAll("\\.+","");//+代表1次到多次
//我我我我要要要要学学学学习习习习
String s2 = s1.replaceAll("(.)\\1+","$1");//$1 代表第一组中的内容,
//我要学习
瞥见Pattern和Matcher
// 典型的调用顺序是 
 Pattern p = Pattern.compile("a*b");
 Matcher m = p.matcher("aaaaab");
 boolean b = m.matches();
//其实和 "aaaaab".matches("a*b");等价
//需求:从一个字符串中把手机号码获取出来
String s = "fahfjf1576922335,fhafnihao18733221548dfaf";
		String regex = "1[3578]\\d{9}";
		Pattern p = Pattern.compile(regex);
		Matcher m = p.matcher(s);
while(m.find())
			System.out.println(m.group());

public boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列

后记

正则表达式 功能十分强大也是难以掌握,我这里知识浅尝,对Pattern和Matcher也没有深入刨析(能力有限),有机会和时间的话,我再深入刨析后,再分享给大家。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值