正表达式

1、正则表达式语法

 参考资料:

老马说编程——正则表达式(上)

正则表达式30分支入门教程

 

正则表达式语法总结

注:加?时表示惰性匹配,即匹配的串尽可能短。如对于aabab,分别用 a.*b、a.*?b 匹配时,前者只有一个匹配结果:aabab,而后者有两个匹配结果:aab、ab。其他通配符的惰性形式同理。

 

注:

分组命名也可以写为(?'name'X),引用时语法为 \k'name'

使用小括号指定一个子表达式后,匹配这个子表达式的文本(也就是此分组捕获的内容)可以在表达式或其它程序中作进一步的处理。默认情况下,每个分组会自动拥有一个组号,规则是:从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。

注:

\b 匹配单词的开头或结尾、\B匹配不是开头和结尾的位置,也就是单词的分界处;^匹配单词开头、$匹配单词结尾。

断言

正零宽断言

  • (?=exp)也叫零宽度正预测先行断言,它断言自身出现的位置的后面能匹配表达式exp(预测右包含)。比如\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),如查找I'm singing while you're dancing.时,它会匹配sing和danc。
  • (?<=exp)也叫零宽度正回顾后发断言,它断言自身出现的位置的前面能匹配表达式exp(预测左包含)。比如(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),例如在查找reading a book时,它匹配ading。

综合例子(?<=\s)\d+(?=\s)匹配以空白符间隔的数字(不包括这些空白符)。

 

负零宽断言

  • (?!exp)也叫零宽度负预测先行断言断言此位置的后面不能匹配表达式exp(预测右不包含)。例如:\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词。\b\w*q(?!u)\w*\b匹配出现了q但q后面不能是u的单词,如果用\b\w*q[^u]\w*\b则会有问题,因为当q位于一个单词末尾时分隔符会被[^u]匹配从而单词也被匹配,如Iraq fighting整个都会被匹配。
  • (?<!exp)也叫零宽度负回顾后发断言,来断言此位置的前面不能匹配表达式exp(预测左不包含)。如(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。

综合例子:(?<=<(\w+)>).*(?=<\/\1>)匹配不包含属性的简单HTML标签内里的内容。(?<=<(\w+)>)指定了这样的前缀:被尖括号括起来的单词(比如可能是<b>),然后是.*(任意的字符串),最后是一个后缀(?=<\/\1>)。注意后缀里的\/,它用到了前面提过的字符转义;\1则是一个反向引用,引用的正是捕获的第一组,前面的(\w+)匹配的内容,这样如果前缀实际上是<b>的话,后缀就是</b>了。整个表达式匹配的是<b>和</b>之间的内容(再次提醒,不包括前缀和后缀本身)。

 

 

2、常用正则表达式

(参考自常用正则表达式

说明:正则表达式通常用于两种任务:1.验证,2.搜索/替换。用于验证时,通常需要在前后分别加上^和$,以匹配整个待验证字符串;搜索/替换时是否加上此限定则根据搜索的要求而定,此外,也有可能要在前后加上\b而不是^和$。此表所列的常用正则表达式,除个别外均未在前后加上任何限定,请根据需要,自行处理。

说明正则表达式
网址(URL)[a-zA-z]+://[^\s]*
IP地址(IP Address)((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)
电子邮件(Email)\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
QQ号码[1-9]\d{4,}
HTML标记(包含内容或自闭合)<(.*)(.*)>.*<\/\1>|<(.*) \/>
密码(由数字/大写字母/小写字母/标点符号组成,四种都必有,8位以上)(?=^.{8,}$)(?=.*\d)(?=.*\W+)(?=.*[A-Z])(?=.*[a-z])(?!.*\n).*$
日期(年-月-日)(\d{4}|\d{2})-((1[0-2])|(0?[1-9]))-(([12][0-9])|(3[01])|(0?[1-9]))
日期(月/日/年)((1[0-2])|(0?[1-9]))/(([12][0-9])|(3[01])|(0?[1-9]))/(\d{4}|\d{2})
时间(小时:分钟, 24小时制)((1|0?)[0-9]|2[0-3]):([0-5][0-9])
汉字(字符)[\u4e00-\u9fa5]
中文及全角标点符号(字符)[\u3000-\u301e\ufe10-\ufe19\ufe30-\ufe44\ufe50-\ufe6b\uff01-\uffee]
中国大陆固定电话号码(\d{4}-|\d{3}-)?(\d{8}|\d{7})
中国大陆手机号码1\d{10}
中国大陆邮政编码[1-9]\d{5}
中国大陆身份证号(15位或18位)\d{15}(\d\d[0-9xX])?
非负整数(正整数或零)\d+
正整数[0-9]*[1-9][0-9]*
负整数-[0-9]*[1-9][0-9]*
整数-?\d+
小数(-?\d+)(\.\d+)?
不包含abc的单词

\b((?!abc)\w)+\b

用尖括号括起来的以a开头的字符串

<a[^>]+>

3、正则表达式的Java API

正则表达式的字符串表示:(转义字符相关:http://www.cnblogs.com/z-sm/p/6944850.html

在Java字符串中一出现反斜杠Java就会将之当做ascll转义字符的开始去解析之,因此其与之后的字符不能组成合法的ascll转义字符就会报错。

在Java中没有什么特殊的语法能直接表示正则表达式,需要用字符串表示之(即在字符串里依次表示正则表达式里的每个字符)。在正则语法中有几个元字符( . $ | ( ) [ { ^ ? * + \ )有特殊含义(如 * 在正则表达式中表示匹配0或多个),根据正则语法若要将这些字符当做普通字符而非元字符来对待则需要加斜杠转义(如当我们想匹配该字符本身,则应该在模式定义中对之转义即 \* ),显然用字符串表示这些元字符的转义字符时(如 "\*")会因为解析不成ASCLL转义字符而报错,解决方法如上所述改为 "\\*" 。一个更极端的例子:在字符串中 \ 是元字符,为了在字符串中表示正则表达式的 \ 就需要两个斜杠即 \\ ;而正则表达式中 \ 也是元字符,为了要匹配 \ 自身,根据正则语法需转义为 \\ ,此时字符串表示就需要四个斜杠即 \\\\ 。

正则表达式中可能出现两种转义字符:预定义的一些正则表达式如表示数字的\d表示字符的\w等、正则语法的元字符当普通字符对待时转义字符(特殊转普通)、ASCLL中的转义字符(普通转特殊)。

总结(正则表达式的字符串形式):根据正则语法定义正则表达式,然后将表达式转为字符串表示:一个简单的规则是正则表达式中的任何一个'\',在字符串中,需要替换为两个'\',(对于ASCLL转义字符斜杠替不替换均可)。更简单的方式是在IDE(如Eclipse)中将定义好的正则表达式复制到String类型变量的值中,会自动添加 '\' 。

Java正则表达式特殊字符匹配示例:

String regEx = "[ _`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?]|\n|\r|\t";
System.out.println(Pattern.compile(regEx).matcher(“hello>”).find());
regEx="^(0\\d{1}|1\\d{1}|2[0-3]):([0-5]\\d{1})$"; //24小时制正则,不能省略前导0

 

 详见:老马说编程——正则表达式(中)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值