正则表达式概述及在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"
正则表达式概述及在JAVA中的使用
最新推荐文章于 2024-08-05 04:33:31 发布