正则表达式
推荐大家一个正则表达式速成网址:http://deerchao.net/tutorials/regex/regex.htm 下面是我的学习笔记 在网页抓取中,我们经常需要分析html内容,而其内容庞大,节点多,如何高效识别呢?推荐大家使用正组表达式: (1)常用元字符常用的元字符 代码 说明
下面例子源文件
hello world 583930459 480558839@qq.com jfdkfjaif@gmail.com jkdjfsj@qq.com 232324qq.com 34343434qq@.com <html> <body> hello world <img src="/NickGirl.jpg" alt="meinv"/> <script src="/virus.js"/> </body> <a href="http://www.google.com">google</a> </html> https://www.sina.com ftp://mit.edu.us http://www.hello.cn pic1.jpg pic2.png pic3.gif 23.43.2.23 192.168.1.2 333.33.33.3 192.12.1234.2 342.23.45.5 23.23.3.4.3 256.255.255.255 255.255.255.255 0.0.0.0 234.255.256.2 bye bye sbsb dancing going beinghere coming here (1)例如:查找qq邮箱
public class Main { static String regex = "d{5,12}@qq.com"; static Pattern pattern = Pattern.compile(regex); public static void main(String[] args) throws Exception { FileInputStream fin = new FileInputStream(new File("data")); BufferedReader br = new BufferedReader(new InputStreamReader(fin)); String line = ""; while((line=br.readLine()) != null){ process(line); } } static void process(String line){ Matcher matcher = pattern.matcher(line); if(matcher.find()){ System.out.println(matcher.group(0)); } } }结果如下:(随便打的qq号,如有雷同,纯属巧合)
480558839@qq.com
regex = "^he.*"; 或者以某个字符结尾 String regex = ".*com$";
(2)常用的限定符代码/语法 说明* 重复零次或更多次 + 重复一次或更多次 ? 重复零次或一次 {n} 重复n次 {n,} 重复n次或更多次 {n,m} 重复n到m次
这种次数的限制非常有用
(3)分支可是,我们经常会遇到多种可能的字符,这时候就需要用到分支条件 例如我们要找出所有图片,可是图片格式多种,有jpg,bmp,png,gif等等,我们应该使用分支条件,就是给出多种可能 可以是使用
regex = "w*.(jpg|png|gif|bmp)"; 找出 NickGirl.jpg
(4)分组经常我们需要局部操作,例如某个组合会出现多次,而前面的几种方法似乎都是针对单字符次数的操作,这里可以采用分组操作: 就是用()前面也有用到一些,比如我们想找Ip地址我们知道他们都是符合同一个规律的
static String regex = "^(((d)|(1?d{2})|(2(([0-4]d)|(5[0-5])))).){3}(((d)|(1?d{2})|(2(([0-4]d)|(5[0-5])))))$"; 我表示写完之后自己都糊涂了。。。
23.43.2.23 192.168.1.2 255.255.255.255 0.0.0.0稍微解释下把: 首先ip可能是1位 2位 3位 1位和2位的时候对数字大小没有限制,所以没问题,可是三位的时候1XX还好,对XX也没限制,可是2XX就有限制了,2【0-4】X这种X是无限制,25【0-5】这就是分支,其实就是分类啦 (1)所以前面1位写成: (d) (2)2位和1XX合并:(1?d{2}) (3)三位 2[0-4]X : (2[0-4]d) (4)三位25[0-5] : (25[0-5]) 把(3)(4)合并 : (2(([0-4]d)|(5[0-5]))) 然后在和(1)(2)合并就可以了,最后加上点. 记得转义字符 结果就出来了
(5)反义字符常用的反义代码 比如说,找出所有标签 static String regex = "<[^>]*>"; 这里就是找出<>这种格式的东西
<html> <body> <img src="/NickGirl.jpg" alt="meinv"/> <script src="/virus.js"/> </body> <a href="http://www.google.com"> </html> (6)后向引用使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。 如果想要找重复的,可以利用后向应用,例如找bye bye这种类型的 String regex = "(w+)s1"; 或者网页标签往往我们想找一个完整的<a></a> 这种引用方式就能够准确进行匹配 static String regex = "<([a-zA-Z]+).*[^>]>.*[^<]</1>"; 仅仅输出这种模式配的上的:
<a href="http://www.google.com">google</a>
(7)贪婪与懒惰匹配懒惰限定符 这个也是我们在网页查找标签中经常用到的例如想找出与<匹配的第一个>如果我们使用 static String regex = "<.+>"; 默认下会贪婪匹配得到:
<html> <body> <img src="/NickGirl.jpg" alt="meinv"/> <script src="/virus.js"/> </body> <a href="http://www.google.com">google</a> </html> 那个<a>标签似乎不是我们想要的
static String regex = "<.+?>"; 用这句
<html> <body> <img src="/NickGirl.jpg" alt="meinv"/> <script src="/virus.js"/> </body> <a href="http://www.google.com"> </html>就是我们需要的啦
(8)正则表达式的选项 常用的处理选项 名称说明 IgnoreCase(忽略大小写)匹配时不区分大小写。 Multiline(多行模式)更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配n之前的位置以及字符串结束前的位置.) Singleline(单行模式)更改.的含义,使它与每一个字符匹配(包括换行符n)。 IgnorePatternWhitespace(忽略空白)忽略表达式中的非转义空白并启用由#标记的注释。 ExplicitCapture(显式捕获)仅捕获已被显式命名的组。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |