引言
RegularExpressions(正则表达式)非常强大,可以极大的减轻我们日常写程序时处理字符串的负担。这两天学习了一下正则表达式,做了一些学习笔记,每一个知识点后面都有详细的例子,分享给大家。文章最后是我写的一个简单的分离网页中的邮件地址的蜘蛛程序,供大家一起交流学习。
1. 用途
2. 使用Pattern和Matcher
Matcher m=pa.matcher("abcd1234");
3. 次数符号
4. 范围符号
5. 转意字符
6. 边界符号
7. 替换方法
8. 分组符号
9. 配合Find使用的函数
10. 匹配模式
11. 可分离网页中的邮件地址的简单蜘蛛程序
/**
* 利用正则表达式,分离出网址中的邮箱地址
* @author 忘川
*/
import java.io.*;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class EmailSpider
{
public static void main(String[] args) throws UnsupportedEncodingException, IOException
{
System.out.print("请输入文件路径或文件夹路径:");
Scanner scan = new Scanner(System.in);
getFiles(scan.nextLine());
for (Iterator<File> i = _allFiles.iterator(); i.hasNext();)
{
File file = i.next();
String name = file.getName();
//从后缀为.html和.htm的文件中寻找邮件地址,过滤无用的文件
if (file.getName().matches(".+\\.html$") || file.getName().matches(".+\\.htm$"))
{
spider(file);
}
}
BufferedWriter bWriter = new BufferedWriter(new FileWriter(".\\email.txt"));
for (Iterator<Map.Entry<Integer, String>> i = email.entrySet().iterator(); i.hasNext();)
{
Map.Entry<Integer, String> kv = i.next();
bWriter.write(kv.getKey() + "\t" + kv.getValue() + "\r\n");
}
bWriter.flush();
bWriter.close();
}
private static List<File> _allFiles = new ArrayList<File>();
private static Map<Integer, String> email = new HashMap<Integer, String>();
private static int Number = 0;
private static void spider(File file) throws FileNotFoundException, UnsupportedEncodingException, IOException
{
InputStreamReader inre = new InputStreamReader(new FileInputStream(file), "GBK");
BufferedReader bReader = new BufferedReader(inre);
String line = "";
//编译一个正则表达式
Pattern pa = Pattern.compile("[\\w[-.]]+@[\\w]+\\.[a-zA-Z[.]]+");
Matcher m = null;
while ((line = bReader.readLine()) != null)
{
//生成一个匹配器
m = pa.matcher(line);
//寻找匹配的子串
while (m.find())
{
//返回匹配成功(即符合模式)子串
String adress = m.group();
//去掉email后面的“.”,发生的概率1/100左右
while (adress.endsWith("."))
{
adress = adress.substring(0, adress.length() - 1);
}
//去掉重复的email地址
if (!email.containsValue(adress))
{
email.put(Number++, adress);
}
}
}
bReader.close();
}
private static void getFiles(String path)
{
File file = new File(path);
if (file.isFile())
{
_allFiles.add(file);
return;
} else
{
File[] list = file.listFiles();
for (File f : list)
{
getFiles(f.getPath());
}
}
}
}
部分结果:
序号 邮件地址
435 szsl8@sina.com
436 yaxu520@163.com
437 xhngweigrass@yahoo.com.cn
438 915650881@qq.com
439 aji301314@163.com
440 197008946@qq.com
441 294470767@qq.com
442 imei598@163.com
443 16717890@QQ.COM
444 618168737@qq.com
445 lubirdhui@163.com
446 benmaofc7496@163.com
447 yp867107@163.com
测试了几个网页,从其中分离处理1000多个邮件地址,以上为部分结果。公布的邮箱地址经过手动脱敏处理,仅用来说明程序的性能,不涉及个人隐私。垃圾邮寄每日困扰这我们的生活,希望大家谨慎在网页上留下邮箱地址。