黑马程序员——方法总结之正则

------ Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

/*
正则表达式
作用:用于专门操作字符串
本质:是一些特定的符号来表示一些代码的操作,其实底层肯定还是代码。
好处:简化了书写。
弊端:符号定义越多,正则越长,阅读性越差。
常用符号:
	字符类 
		[abc] 			a、b 或 c(简单类) 
		[^abc] 			任何字符,除了 a、b 或 c(否定) 
		[a-zA-Z] 		a 到 z 或 A 到 Z,两头的字母包括在内(范围) 
		[a-d[m-p]] 	a 到 d 或 m 到 p:[a-dm-p](并集) 
		[a-z&&[def]] 	d、e 或 f(交集) 
		[a-z&&[^bc]] 	a 到 z,除了 b 和 c:[ad-z](减去) 
		[a-z&&[^m-p]] a 到 z,而非 m 到 p:[a-lq-z](减去) 
	预定义字符类 
		. 任何字符(与行结束符可能匹配也可能不匹配) 
		\d 数字:			[0-9] 
		\D 非数字: 		[^0-9] 
		\s 空白字符:		[ \t\n\x0B\f\r] 
		\S 非空白字符:	[^\s] 
		\w 单词字符:		[a-zA-Z_0-9] 
		\W 非单词字符:	[^\w] 
	边界匹配器 
		^ 		行的开头 
		$ 		行的结尾 
		\b 	单词边界 
		\B 	非单词边界 
	Greedy 数量词 
		X? 		X,一次或一次也没有 
		X* 		X,零次或多次 
		X+ 		X,一次或多次 
		X{n} 	X,恰好 n 次 
		X{n,} 	X,至少 n 次 
		X{n,m} X,至少 n 次,但是不超过 m 次 
组的封装和捕获
	可以将规则封装成一个组。用()完成。组的出现都有编号,从1开始。
	想要使用已有的组可以通过  \n(n就是组的编号)的形式来获取。
	如:用叠词切割字符串
		String line = "abadddddefdggdgdfffdegbd";
		String regex = "(.)\\1+";
		在表达式 ((A)(B(C))) 中,存在四个这样的组: 通过从左到右计算其开括号来编号
		组1     ((A)(B(C))) 
		组2     \A 
		组3     (B(C)) 
		组4     (C) 
		组零始终代表整个表达式。
		组的引用:使用$n来引用组,一般用在替换操作中
		替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号
		获取正则表达式中的已有的组。
		如:把一个字符串中的叠词替换成一个字符
		String line = "abadddddefdggdgdfffdegbd";
		line.replaceAll("(.)\\1+","$1");即:用组1中的内容替换满足表达式规则的内容
1.匹配
	String 类的mathes方法		public boolean matches(String regex)
	用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
		对QQ号码进行校验要求:5~15  0不能开头,只能是数字
		String regex = "[1-9]\\d{4,14}";
		匹配手机号段只有 13xxx 15xxx 18xxxx
		String telReg = "1[358]\\d{9}";
2.截取
	String类的split功能		public String[] split(String regex)
		按照叠词完成切割
		splitDemo("erkktyqqquizzzzzo","(.)\\1+");
		按目录切割
		splitDemo("c:\\abc\\a.txt","\\\\");
3.替换
	String类的replaceAll功能		public String replaceAll(String regex,String str)
	注意:此方法是得到了一个新的字符串,原字符串的内容并为发生变化。当然可以重新赋值给原串。
	String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号
		将叠词替换成#
		replaceAll("(.)\\1+","#");
		将叠词替换成单个字符
		replaceAll("(.)\\1+","$1");
4.获取
	如:获取一段字符串中符合规则的数据,获取3个字符的单词
	String str = "ming tian jiu yao fang jia le ,da jia。";
	String reg = "\\b[a-z]{3}\\b";
	使用正则表达式的特有功能,步骤:
		A:将正则表达式封装成对象
			查看API可以发现正则表达式的描述是在Pattern类中,此类是正则表达式的编译表示形式
			Pattern p = Pattern.compile(reg);
		B:让正则对象和要操作的字符串相关联,获取匹配器对象
			Matcher m = p.matcher(str);
		C:通过匹配器对象的方法对符合规则的子串进行操作,如查找和获取
			while(m.find()){
				System.out.println(m.group());
				System.out.println(m.start()+"...."+m.end());
			}
			其实String类的matches方法,用的就是Pattern和Matcher对象来完成的
			只不过被String的方法封装后用起来较为简单,但是功能比较单一。
			m.matches();//这里匹配的是符合规则的子串,如果是String的方法,匹配的这是整个字符串。
			
到底用四种功能中的哪一个呢?或者哪几个呢?
	思路方式:
	1,如果只想知道该字符是否对是错,使用匹配。
	2,想要将已有的字符串变成另一个字符串,替换。
	3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
	4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。
*/



你可能感兴趣的:(java基础)