正则表达式概述及在JAVA中的使用

 
正则表达式概述及在JAVA中的使用



构建正则表达式
  /d 等于 [0-9] 数字
  /D 等于 [^0-9] 非数字
  /s 等于 [ /t/n/x0B/f/r] 空白字符
  /S 等于 [^ /t/n/x0B/f/r] 非空白字符
  /w 等于 [a-zA-Z_0-9] 数字或是英文字
  /W 等于 [^a-zA-Z_0-9] 非数字与英文字
  $ 表示每行的结尾
  . 匹配所有字符,包括空格、Tab字符甚至换行符
  | 或
  []方括号只允许匹配单个字符
  ^ 符号称为“否”符号。如果用在方括号内,表示不想要匹配的字符。 表示每行的开头
  ( ) 形成一组


1.1 句点符号
表达式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,还匹配“t#n”、“tpn”甚至“t n”


1.2 方括号符号
正则表达式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。
但“Toon”不匹配,因为在方括号之内你只能匹配单个字符


1.3 “或”符号 
使用“t(a|e|i|o|oo)n”正则表达式,匹配tan,ten,tin,ton,toon
这里不能使用方扩号,因为方括号只允许匹配单个字符;这里必须使用圆括号“()”。圆括号还可以用来分组。

1.4 表示匹配次数的符号
*      0次或者多次
+      1次或者多次
?      0次或者1次
{n}    恰好n次
{n,m}  从n次到m次


假设我们要在文本文件中搜索美国的社会安全号码。这个号码的格式是999-99-9999。
用来匹配它的正则表达式是
[0-9]{3}/-[0-9]{2}/-[0-9]{4}
在正则表达式中,连字符(“-”)有着特殊的意义,它表示一个范围,比如从0到9。因此,匹配社会安全号码中的连字符号时,它的前面要加上一个转义字符“/”。
在程序应该写成[0-9]{3}//-[0-9]{2}//-[0-9]{4}


假设进行搜索的时候,你希望连字符号可以出现,也可以不出现,如999-99-9999和999999999都属于正确的格式。
用来匹配它的正则表达式是
[0-9]{3}/-?[0-9]{2}/-?[0-9]{4}
也可以改成/d{3}/-/d{2}/-/d{4}

下面我们再来看另外一个例子。
美国汽车牌照的一种格式是四个数字加上二个字母。
正则表达式前面是数字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。
完整的正则表达式
[0-9]{4}[A-Z]{2}


1.5 “否”符号

“^”符号称为“否”符号。
如果用在方括号内,“^”表示不想要匹配的字符。
例如,图四的正则表达式匹配所有单词,但以“X”字母开头的单词除外。 
[^x][a-z]+


1.6 圆括号和空白符号
假设要从格式为“June 26, 1951”的生日日期中提取出月份部分,
用来匹配该日期的正则表达式:
[a-z]+/s+[0-9]{1,2},/s*[0-9]{4}

查询
import java.util.regex.*;
public class RegexExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str="June 26, 1951";
		String regEx="[a-z]+/s+[0-9]{1,2},/s*[0-9]{4}";	
		Pattern p=Pattern.compile(regEx);
		Matcher m =p.matcher(str);
		boolean rs=m.find();
		if(rs)
			System.out.println("include");

		else
			System.out.println("not include");
	}
}


应用实例
3.1 日志文件处理

任务:分析一个BEA WebLogic日志文件中,日志记录的格式如下:
172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]"GET /IsAlive.htm HTTP/1.0" 200 15
首先我们来看看IP地址。IP地址有4个字节构成,每一个字节的值在0到255之间,各个字节通过一个句点分隔。因此,IP地址中的每一个字节有至少一个、最多三个数字。
IP地址编写的正则表达式: 
/d{1,3}/./d{1,3}/./d{1,3}/./d{1,3}

日志记录的时间部分由一对方括号包围。你可以按照如下思路提取出方括号里面的所有内容:首先搜索起始方括号字符(“[”),提取出所有不超过结束方括号字符(“]”)的内容,向前寻找直至找到结束方括号字符。图九显示了这部分的正则表达式。
/[  [  ^]  ]+  /]

现在,把上述两个正则表达式加上分组符号(圆括号)后合并成单个表达式,这样就可以从日志记录提取出IP地址和时间。

(/d{1,3}/./d{1,3}/./d{1,3}/./d{1,3})/s-/s-/s/[([^]]+)/]

提取
import java.util.regex.*;
public class RegexExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str="172.26.155.241 - - [26/Feb/2001:10:56:03 -0500]/"GET /IsAlive.htm HTTP/1.0/" 200 15";
		String regEx="(//d{1,3}//.//d{1,3}//.//d{1,3}//.//d{1,3})//s-//s-//s//[([^]]+)//]";	
		Pattern p=Pattern.compile(regEx);
		Matcher m =p.matcher(str);
		boolean rs=m.find();
		if(rs){
			System.out.println("include");
			System.out.println(m.group(1));
			System.out.println(m.group(2));
		}
		else
			System.out.println("not include");
	}
}



3.2 HTML处理实例一
<font face="Arial,Serif" size="+2" color="red">

它从字体标记提取出“"face="Arial, Serif" size="+2" color="red"”。

</s*font/s*([^>]*)/s*>

第二个正则表达式把各个属性分割成名字-值对。
([a-z]+)/s*=/s*"([^"]+)"
分割结果为:
face Arial,Serif
size +2
color red

//复杂分割
import java.util.regex.*;
public class RegexExample {
	public static void main(String[] args) {
		String str="<font face=/"Arial,Serif/" size=/"+2/" color=/"red/">";
		String regEx="<//s*font//s*([^>]*)//s*>";
	
		Pattern p=Pattern.compile(regEx);
		Matcher m =p.matcher(str);
		boolean rs=m.find();
		if(rs){
			System.out.println("include");
			System.out.println(m.group(1));
		}
		else
			System.out.println("not include");

		//分割
		str=m.group(1);		
		regEx="([a-z]+)//s*=//s*/"([^/"]+)/"";	
		p=Pattern.compile(regEx);
		m =p.matcher(str);
		rs=m.find();
		while(rs){			
			System.out.println(m.group(1)+" "+m.group(2));
			rs=m.find();
		}
	}
}

输出:
include
face="Arial,Serif" size="+2" color="red"
face Arial,Serif
size +2
color red


//简单分割
import java.util.regex.*;
public class RegexExample {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String str="<font face=/"Arial,Serif/" size=/"+2/" color=/"red/">";
		String regEx="/"";

		Pattern p=Pattern.compile(regEx);
		Matcher m =p.matcher(str);
		String [] r=p.split(str);
		for(int i=0;i<r.length;i++){
			System.out.println(r[i]);
		}
	}
}





替换(删除)

import java.util.regex.*;
public class RegexExample {
	public static void main(String[] args) {
		String str="aaabbced a ccdeaa";
		String regEx="a+";
	
		Pattern p=Pattern.compile(regEx);
		Matcher m =p.matcher(str);
		String s=m.replaceAll("A");
		System.out.println(str);
		System.out.println(s);
	}
}
  
结果为"Abbced A ccdeA"
  
如果写成空串,既可达到删除的功能,比如:
String s=m.replaceAll("");
结果为"bbced ccde"










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值