黑马程序员_正则表达式

 
 
------------- android培训java培训、java博客、java学习型技术博客、期待与您交流! -------------

正则表达式

定义:符合一定规则的表达式 作用:用于专门操作字符串 特点:用一些特定的符号来表示一些代码操作,简化书写 好处:可以简化对字符串的复杂操作 弊端:符号定义越多,正则越长,阅读性较差 涉及类:Pattern、Matcher

正在表达式的四种功能

1、匹配 boolean matches(String regex) 用规则匹配整个字符串,只要有一处不符合规则就返回false 字符串各角标位上字符规则 字符类  [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](减去)  一个[]表示只有1个字符,[]里面的内容代表该字符所需要符合的规则 例如:[abc]代表该字符串只有1个字符且该字符必须是abc中的1个。 预定义字符类  . 任何字符(与行结束符可能匹配也可能不匹配)  \d 数字:[0-9]  \D 非数字: [^0-9]  \s 空白字符:[ \t\n\x0B\f\r]  \S 非空白字符:[^\s]  \w 单词字符:[a-zA-Z_0-9]  \W 非单词字符:[^\w]  注意:\是一个普通符号,不是转义字符,所以正则表达式中需多加一个\将后\转成普通字符  正则表达式中反斜杠出现都是成对出现 例如:[a-z]\\d  表示该字符串由两个组成且第一个字符是a-z第二字符为0-9数字 字符串长度规则 Greedy 数量词  X? X,一次或一次也没有  X* X,零次或多次  X+ X,一次或多次  X{n}   X,恰好 n 次  X{n,} X,至少 n 次  X{n,m} X,至少 n 次,但是不超过 m 次  例如:[a]\\d?  表示第一位为a,第二位可以是数字也可以没有  [z]\\d*  表示第一位为a,后面可零或多个数字  [1-9]\\d{4,14} 表示第一位为非零数字,后面接着有4-14个数字(QQ号匹配)  1[358]\\d{9} 表示第一位为1,第二位为358中1个,后面跟9个数字(手机号匹配) 首位规则 边界匹配器  ^ 行的开头  $ 行的结尾  \b 单词边界  \B 非单词边界  \A 输入的开头  \G 上一个匹配的结尾  \Z 输入的结尾,仅用于最后的结束符(如果有的话)  \z 输入的结尾  2、切割 String[] split(String regex) 组:(regex)表示组,组里面封装了regex,且组里面可以内嵌多个组。 第一个左括号为第一组,依次继续;想要使用已有的组,可以通过\n的形式来获取。 见示例 3、替换 String replaceAll(String regex,String replacement) 将一个字符串中符合规则的部分替换成另外一个部分 $特殊符号,用以获取前面组中的规则,例如获取第一组规则,$1; 4、获取 将字符串中符合规则的字串取出 Pattern类,正则表达式的编译表示形式 Matcher类,匹配器,通过解释Pattern类对character sequence执行匹配操作的引擎 步骤 1、将正则表达式封装成对象 static Pattren compile(String regex) 2、让正则对象和要操作的字符串相关联 3、关联后,获取正则匹配引擎 Matcher matcher(charSequence input) 4、通过引擎对符合规则的字串进行操作, boolean find()  找符合规则的字串,有则返回true String group()  找完返回ture,调用此方法将规则取出 总结 1、仅判断字符正确与否,使用匹配 2、将已有字符串变另一个字符串,使用替换 3、按照指定方式将字符串变成多个字符串,使用切割(获取规则以外的子串) 4、获取符合需求的字符字串,使用获取
//切割演示
class RegexDemo 
{
	public static void main(String[] args) 
	{
		//以不固定空格数切割该字符
		String str1 = "zhangsan   lisi    wangwu";
		String reg1 = "\\s+";
		splitDemo(str1,reg1);
		
		//用.来切字符串,
		String str2 = "zhangsan.lisi.wangwu";
		String reg2 = "\\.";  //注意此处加\\,因为.在正则里面表示任意字符
		splitDemo(str2,reg2);
		
		//用\\来切
		String str3 = "c:\\abc\\a.txt";
		String reg3 = "\\\\";
		splitDemo(str3,reg3);
		
		//按照叠词完成切割
		String str4 = "javakkkjavaqqjavazzzzjava";
		String reg4 = "(.)\\1+";   //组的应用
		splitDemo(str4,reg4);
	}
	public static void splitDemo(String str,String reg)
	{
		String[] arr = str.split(reg);
		for(String s : arr)
		{
			System.out.println(s);
		}
	}
}

//替换演示
class RegexDemo 
{
	public static void main(String[] args) 
	{
		//将数字替换成#
		String str1 = "i312423434love32423you";
		String reg1 = "\\d+";
		String rep1 = "#";
		replaceAllDemo(str1,reg1,rep1);
		
		//将叠词替换成单个词
		String str2 = "iilllloovvvveyyouuuu";
		String reg2 = "(.)\\1+";
		String rep2 = "$1"; //$1获取前面第一组的规则
		replaceAllDemo(str2,reg2,rep2);

	}
	public static void replaceAllDemo(String str,String reg,String rep)
	{
		str = str.replaceAll(reg,rep);
		System.out.println(str);
	}
}

// 获取演示
import java.util.regex.*;
class RegexDemo 
{
	public static void main(String[] args) 
	{
		String str = "ming tian fang jia le , da jia .";
		String reg = "\\b(\\w+)\\b";   // \b为单词边界
		//将正则表达式封装成对象
		Pattern p = Pattern.compile(reg);
		//让正则对象和要操作的字符串相关联,关联后,获取正则匹配引擎	
		Matcher m = p.matcher(str);
		//通过引擎对符合规则的字串进行操作,
		while(m.find())
		{
			System.out.println(m.group());
		}
	}
}

//练习
import java.util.regex.*;
import java.util.*;
class RegexDemo 
{
	public static void main(String[] args) 
	{
		test1();
		test2();
		checkMail();
	}
	public static void checkMail()
	{
		//对邮件地址进行校验
		String mail = "abc123@163.com.cn";
		String reg1 = "[a-zA-Z0-9_]+@[a-zA-Z0-9_]+(\\.[a-zA-Z]+)+"; //较精确匹配
		String reg2 = "\\w+@\\w+(\\.\\w+)+";//一般匹配 
		//(reg)+代表整个规则出现1次或多次,(reg)\\1+代表reg出现1次或多次
		System.out.println(mail.matches(reg1));
	}
	public static void test2()
	{
		//将IP地进行地址段顺序的排序
		String ip = "192.68.1.254 102.49.23.013 10.10.10.10 2.2.2.2 8.109.90.30";
		//在每一段数字的前面加两个0
		ip = ip.replaceAll("(\\d+)","00$1");
		//每一段数字只保留三位,去掉前面多余的0
		ip = ip.replaceAll("0*(\\d{3})","$1");
		
		String[] arr = ip.split(" ");
		Arrays.sort(arr);
		for(String ip1 : arr)
		{
			ip1 = ip1.replaceAll("0*(\\d+)","$1");
			System.out.println(ip1);
		}
	}
	public static void test1()
	{
		//将str转成 我要学编程
		String str = "我我..我我...我要..要要.要要..学学学...学学...编编编..程程...";
		//将.去掉
		str = str.replaceAll("\\.","");
		//将叠词变成单个字符
		str = str.replaceAll("(.)\\1+","$1");
		System.out.println(str);
	}
}

------------- android培训 java培训 、java博客、java学习型技术博客、期待与您交流! -------------
详情请查看:http://edu.csdn.net/heima/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值