正则表达式

抓网页,用dom很不容易,看有几个网站是100%规矩的~

 

用正则,经过试验,是最快的。(指定网页,指定内容)

 

#一个不错的文档

http://hi.baidu.com/personnel/blog/item/398142a7e792b795d0435822.html

http://hi.baidu.com/personnel/blog/item/6ac534a8ac7ef2b1ca130c23.html

http://iwgod.com/know_showKnowledgeByID=knowledge.kid_70.htm

 

另外,java正则中的几个高级东西记录一下

1. 贪婪,不情愿,所有格(贪婪+占有)

Greedy,Reluctant,Possessive

input string xfooxxxxxxfoo.

    
    Enter your regex: .*foo  // greedy quantifier
    Enter input string to search: xfooxxxxxxfoo
    I found the text "xfooxxxxxxfoo" starting at index 0 and ending at index 13.

Greedy 其实是整个字符串开始匹配,然后慢慢的backs off,这样就能得到最大匹配串
(backs off的行为到底是怎么样的我没有研究)


    Enter your regex: .*?foo  // reluctant quantifier
    Enter input string to search: xfooxxxxxxfoo
    I found the text "xfoo" starting at index 0 and ending at index 4.
    I found the text "xxxxxxfoo" starting at index 4 and ending at index 13.

reluctant 是从字符串的最开始开始匹配,慢慢的增加,所以匹配到的是最小字串


    Enter your regex: .*+foo // possessive quantifier
    Enter input string to search: xfooxxxxxxfoo
    No match found.

possessive 是greeedy + no backs off,相当于整个字符串都塞进来看,结果.*就匹配了所有串,foo没有匹配到,所有就no match found

最后推荐一下 pattern 工具,这个工具的tutorial也很不错
http://www.regular-expressions.info/tutorial.html

 

--另一个不错的文章

 

2.匹配模式

看java的类Pattern中介绍,匹配模式见Pattern类的几个静态字段

例如:Pattern.DOTALL,在 dotall 模式中,表达式 . 可以匹配任何字符,包括行结束符。默认情况下,此表达式不匹配行结束符。

启用dotall的方式有两种,从我们实际项目来看,推荐用#2,否则得老改动程序,或者写多个方法:

#1 在类中指定,Pattern.compile (String regex, int flags) ,如Pattern p = Pattern.compile(regex, Pattern.DOTALL);

#2 在正则表达式的开头用 (?s) 打开dotall,用 (?- s) 关闭dotall

 

3.匹配组

(?:X) X,作为非捕获组
与捕获组 ( ) 的意思一样也是将其作为一组进行处理,与捕获组的区别在于不捕获匹配的文本,
仅仅作为分组。
比如:要匹配 123123 这个,就可以写为 (123)\1 使用反向引用,这时只能用捕获组,在匹配
123 后会保留在内存中,便于反向引用,而 (?:123) 在匹配完后则不会保留【计算捕获组时不计算在内,即不能引用】,例如(?:123)\1 会报错!。

(?idmsux-idmsux)  Nothing,但是将匹配标志i d m s u x on - off
用于标志匹配,比如:表达式 (?i)abc(?-i)def 这时,(?i) 打开不区分大小写开关,abc 匹配
不区分大小地进行匹配,(?-i) 关闭标志,恢复不区分大小写,这时的 def 只能匹配 def

(?idmsux-idmsux:X)   X,作为带有给定标志 i d m s u x on - off  
与上面的类似,上面的表达式,可以改写成为:(?i:abc)def,或者 (?i)abc(?-i:def)

(?=X) X,通过零宽度的正 lookahead 
(?!X) X,通过零宽度的负 lookahead

(?=X) 表示当前位置(即字符的缝隙)后面允许出现的字符,比如:表示式 a(?=b),在字符串为
ab 时,可能匹配 a,后面的 (?=b) 表示,a 后面的缝隙,可以看作是零宽度。
(?!X) 表示当前位置后面不允许出现的字符

(? <=X) X,通过零宽度的正 lookbehind 
(? <!X) X,通过零宽度的负 lookbehind

这两个与上面两个类似,上面两个是向后看,这个是向前看

(?>X) X,作为独立的非捕获组
匹配成功不进行回溯,这个比较复杂,也侵占量词“+”可以通用,比如:\d++ 可以写为 (?>\d+)。

 

4.

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值