黑马程序员_正则表达式

本文介绍了Java中正则表达式的应用,包括匹配、切割、替换和获取等核心功能,并通过示例展示了如何使用这些功能处理字符串。文章还列举了一些常用的正则表达式语法。
---------- android培训java培训、java学习型技术博客,期待与您交流!----------
        正则表达式(regular expression)是用来指定字符串模式的方法,在java中可以方便的在任何需要定位匹配某种特定模式的字符串的情况下使用正则表达式。
        正则表达式的特点在于用一些特定的符号来表示代码操作,简化了代码书写。因此好处和弊端也是显而易见,优点是简化了对字符串的复杂操作,带来的副作用则是如果符号定义太多,正则表达会很长,阅读性相当差。然而,不可否认正则表达式是十分实用的操作字符串的方法。正则表达式语法有很多,具体可以参阅API,下面只例举一部分较常用的。
字符类 
[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] 

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

        正则表达式正是通过上述及更多语法的组合来表示代码操作的。概括而言,正则表达式有四个功能:匹配、切割、替换、获取。需要注意的是,匹配、切割和替换都在String类中定义了相关方法,而获取则没有。想要完成获取功能,需要使用util.regex包中的Pattern类和Matcher类。  在实际使用中,如何取舍这四个功能,可以这样判断:为了校验字符串是否符合要求,使用匹配;要将已有字符串变成另一个字符串,使用替换;想按指定方式将一个字符串分成多个字符串,使用切割;想要取得符合要求的原字符串的子串,使用获取。下面来看具体示例(只贴功能部分)。
public static void checkMail(){
		String mail = "abc12@sina.com";

		String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。
		reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。

		System.out.println(mail.matches(reg));
	}

public static void main(String[] args) {
	
		splitDemo("erkktyqqquizzzzzo","(.)\\1+");//按照叠词完成切割。为了可以让规则的结果被重用,
							 //可以将规则封装成一个组。用()完成。组的出现都有编号。
							 //从1开始。想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。
	}

public  static void splitDemo(String str,String reg){
		String[] arr = str.split(reg);
		System.out.println(arr.length);
		for (String s : arr) {
			System.out.println(s);
		}
	}

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");
		System.out.println(ip);

		ip = ip.replaceAll("0*(\\d{3})","$1");
		System.out.println(ip);

		String[] arr = ip.split(" ");

		TreeSet<String> ts = new TreeSet<String>();

		for (String s : arr) {
			ts.add(s);
		}

		for (String s : ts) {
			System.out.println(s.replaceAll("0*(\\d+)","$1"));
		}
	}
}

public static void getDemo(){
		String str = "ming tian jiu yao fang jia le ,da jia。";
	
		String reg = "\\b[a-z]{4}\\b";

		Pattern p = Pattern.compile(reg);

		Matcher m = p.matcher(str);

		while(m.find()){
			System.out.println(m.group());
			System.out.println(m.start()+"...."+m.end());
		}
	}

        上述代码分别对应匹配、切割、替换和获取。匹配部分中,(\\.[a-zA-Z]+)+ 或 (\\.\\w+)+ 这部分正则是指点加一个或多个字母这一整体是一个或多个,即对应邮箱账号的后缀,现实情况中后缀一般不超过三个,因此该正则表达式还可以匹配得更精确些。 替换部分实际上是实现了IP地址的排序,在此过程中用了三个替换规则并且伴有一次切割。其中$1表示的是取第一组。获取部分是要求取得所有连续四个字母的子串,正则表达式中\\b是单词边界匹配器。
---------- android培训java培训、java学习型技术博客,期待与您交流!----------
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值