您的位置:首页 > 移动开发 > Android开发

Android开发:15分钟学会Java正则表达式

2015-12-26 17:27 363 查看
前言:Android 开发过程中,经常会遇到使用一些Java正则表达式,很多时候是要自己写,但是很多人写得并不好,很大原因是没有系统性的学习正则表达式。现在只要抽出15分钟,这篇文章可以让你系统性的掌握一些正则表达式的基本用法,但是不能保证你学会80%,但是可以保证你明白80%,并且可以开始写出一些满足你工作中基本的需求正则表达式来,同时还需要在以后的工作学习中不断反复的实战才能达到另一个高度,就我本人来说,我以前遇到需要使用正则时候就做一个伸手党,但是,现在经过我不断的研究,基本可以自己写出正则了。给自己15分钟,拒绝做伸手党!“share your knowledge with the world!”

元字符:

\b
:匹配一个位置,如
\bhi\b
匹配
hi
单词。

.
:除换行符以外的任意单个字符。

*
:前面内容任意连续重复使用任何次【可以0次】
\bhi\b.*\btom\b
hi
后面不远处跟着一个
tom


\d
:一位数字
0~9
0\d{3}-\d{8}
区号3位的电话号码【等价于
0\d\d\d-\d\d\d\d\d\d\d\d
】。

\s
:任意的空白符,空格,TAB,换行符,中文全角空格。

\w
:字母或数字或下划线或汉字。

eg:
\w*
:任意数量的字母或数字等。

+
:任意次数,【至少1次】。

\d+
:1个或更多的连续数字。

eg:
\b\w{6}\b
刚好是6个字符的单词。

^
:字符串的开始。

$
:字符串的结束 。

eg:
^\d{5,12}$
QQ号码,
5位 <= QQ号码 <=12位


?
:【0次或1次】。

{n}
:重复n次,eg:
x=n


{n,}
:重复n次 或更多次
n <= x < +oo


{n,m}
:重复n到m次
n<=x<=m


[]
:
[]
里面任意的字符 。

eg:
[aeiou]
任意一个元音字母 。

eg:
[.?|]
表示
.
?
|


eg:
[0-9]
等价于
\d


eg:
[a-z0-9A-Z]
等价于
\w
(只考虑英文时候) 。

eg:
\(?0\d{2}[) -]?\d{8}
:电话号码
(020)-23512512
(020-23512512
02023512512
(解决此问题使用分枝)。

转义字符:

\
:表示转义。

eg:
\.
:表示
.


eg:
\*
:表示
*


eg:
\\
:表示
\


eg:
\(
:表示
(


eg:
\)
:表示
)


分枝:

|
:分枝的分隔符,从左到右匹配,匹配了一个分枝,即中止后面的分枝匹配

0\d{3}-\d{8}|0\d{4}-\d{7}
3位区号,8位本地号(如
010-12345678
) 4位区号,7位本地号(
0376-2233445
)。

分组:

()
:表示分组:

如简单IP地址:
(\d{1,3}\.){3}\d{1,3}
不幸的是,它也将匹配
256.300.888.999
这种不可能存在的IP地址。

解决:
((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)


【IP地址中每个数字都不能大于255. 经常有人问我, 01.02.03.04 这样前面带有0的数字, 是不是正确的IP地址呢? 答案是: 是的, IP 地址里的数字可以包含有前导 0 】

反义(注意大写):

\W
:任意不是字母,数字,下划线,汉字的字符【与
\w
刚好相反】。

\S
:任意不是空白符。

\D
:任意非数字字符。

\B
:不是单词开头或结束位置。

[^x]
:除了x以为的任意字符。

eg:
[^aeiou]
:除aeiou 以外的任意字符

eg:
\S+
不包含空白符的字符串。

<a[^>]+>
尖括号括起来的以a开头的字符串。

下面是普通开发中使用比较少的,了解一下,如需深入研究可以自行寻找其他资料。

后向引用:

分组,从左到右分别会编组号,1组 2组…。

\1
:代表分组1匹配的文本。

要匹配像这样的
go go
,
tom tom
的,用后向引用解决:

\b(\w+)\b\s+\1\b
分析:

1、
\b(\w+)\b
:单词开始处和结束处之间的多于一个的字母或数字。

2、
\s+
:一个或几个空格。

3、
\1
:分组1。

4、
\b
:位置结束。

上述可以指定分组的名称,比如我要指定为
myCode
名字

使用
?<myCode>
,后向引用它使用
\k<myCode>
(尖括号可以用’代替)

\b(?<myCode>\w+)\b\s+\k<myCode>\b


捕获 :

exp代表表达式:

(exp)
:匹配exp,并捕获文本自动到命名的组里。

(?<name>exp)
:匹配exp,并捕获文本到名称为name的组里,也可以写成
(?'name'exp)


(?:exp)
:匹配exp,不捕获文本,也不分配到组。

零宽断言:

(?=exp)
:匹配exp前面的位置

(?<=exp)
:匹配exp后面的位置

(?!exp)
:匹配后面跟的不是exp的位置

(?<!exp)
:匹配前面跟的不是exp的位置

尾声:

最后,贡献几个开发中常用到的几个正则:

域名正则:

^((https?|ftp|news):\/\/)?([a-z]([a-z0-9\-]*[\.])+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)|(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))(\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(\?[a-z0-9+_\-\.%=&]*)?)?(#[a-z][a-z0-9_]*)?$


手机号码正则:

^0{0,1}1[3|4|5|6|7|8|9][0-9]{9}$


IPV4正则:

^((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)$


ok,如果你认真看的话,估计不止花了15分钟,不过我认为这都是值得的,学习需要耐心和毅力,要有研究的心态心境,你才能在以后的职业生涯中获得源源不断的增量来提升自己的竞争力。

本博文主要受益于这篇博客:http://deerchao.net/tutorials/regex/regex.htm

本博文主要是带你快速了解正则,深入学习还得在以后工作中慢慢历练。

正则表达式工具推荐http://www.cr173.com/soft/16129.html,这个工具能透视你的表达式,让你更加理解表达式的结构,从此你也是正则大神,不再做伸手党!

android未来技术先驱者QQ群:468191212,欢迎你的加入,共同通过技术建立美好的世界!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息