一、什么是正则表达式
正则表达式(Regular Expression)是通过一些特殊的字符的排列,用以查找、替换、删除一行或多行文字字符串,简单的讲,正则表达式就是用在字符串处理上面的一项“表达式”。——《鸟哥的LINUX私房菜》
在Unix标准工具集中,比如sed和awk,提供了对正则表达式的良好支持,不过这里准备重点讨论在编程语言中的正则表达式。首先,Python和Perl,正则表达式早就整合其中。对于Java而言,String、StringBuffer和StringTokenizer只提供了对字符串的简单操作,而正则表达式是一种非常强大的文本处理工具。
关于正则表达式的基本知识,我觉得有下面这个链接就够啦
http://deerchao.net/tutorials/regex/regex.htm
这里面想要重点说明的是后向引用和零宽断言。理解后向引用先得明白分组的概念,分组中组号的编排是重点,其中,分组0对应整个正则表达式,命名组的组号都大于未命名的组号,这两点需要重点理解。另外,对于其中的举例:(?<=<(\w+)>).*(?<=\/\1>),这个表达式在网络编程时,需要提取不包含属性的简单HTML标签内的内容,会经常用到的。
二、Java中的正则表达式及用法举例
在Java中应用正则表达式,主要从两个方面考虑:
(1)字符串的匹配
与其说是在Java中,不如说是在编程语言中,因为,字符串的匹配并不涉及Java中与正则表达式相关的类。这里主要使用字符串的matches()方法。
File file = new File("/data/data/PACKAGE_NAME/FILE_NAME/");
fileNameString = file.list();
for(int i = 0; i < fileNameString.length; i++) {
if(fileNameString[i].matches("(U|\\d).*\\.db"))
fileNameDisplay.add(fileNameString[i]);
}
fileName = new String[fileNameDisplay.size()];
for(int i = 0; i < fileNameDisplay.size(); i++)
fileName[i] = fileNameDisplay.get(i);
这里首先创建一个File类的引用,其路径指向"/data/data/PACKAGE_NAME/FILE_NAME/"(应该能看出来这是在Android中访问Flie),然后通过File类的list()方法获取该路径文件夹下对应的所有文件(包括文件夹)的文件名,并且返回字符串数组。正则表达式要做的事情就是将这个字符串数组中符合一定要求的字符串提取出来,这里采用了一个List<String> fileNameDisplay(当然,也可以不用这个List,),重点说一下if(fileNameString[i].matches("(U|\\d).*\\.db"))这一句中(U|\\d).*\\.db,首先,该字符串以U或者数字开头,其后接任意个任意字符,最后再以.db结尾。这里其实就是
提取该目录中的数据库文件的文件名。
(2)Pattern和Matcher
上述String类只能说是功能有限(当然,并不表示应用场合少)。在包java.util.regex中,包含了Java对正则表达式的支持,其中,Pattern和Matcher是两个最常使用的类。
首先,用static Pattern.compile()方法编译正则表达式,它会根据String类型生产一个Pattern对象。然后将需要进行检索的字符串转入Pattern对象的matcher()方法,得到一个Matcher对象,这个Matcher对象就比较有用啦。下面看一下实例:
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(retrievalString);
while(m.find()) {
System.out.println("Match \"" + m.group + "\" at positions " + m.start() + "-" +(m.end() - 1));
}
正则表达式之所以有难度,其关键在于它的语法。不过只要经常使用,看的多了,自然就把看不习惯的看习惯了(比如,天朝的网络环境……呵呵,你懂得)。