正则表达式的使用(附实例讲解)

[size=large][b]一、正则表达式是什么[/b][/size]
正则表达式是一种字符串匹配的模式,你也可以理解为定义了一种模板,这个模板可以“筛选”出符合它要求的字符串。如果给定了一段字符串,你可以对它进行特定字符串的查找和替换等一系列动作。正则表达式的重点是匹配,就像灰姑娘的水晶鞋,只有和灰姑娘脚大小相同的人才能穿进去,因为两者相匹配。
[size=large][b]二、正则表达式怎样使用[/b][/size]
[size=medium]2.1 ------[b]基础知识[/b]------[/size]
我们首先介绍一下正则表达式的一些基础知识,这些理论知识将为编写正则表达式提供法则和规范,主要包括:[b]元字符[/b]、[b]字符类[/b]、[b]字符转义[/b]、[b]反义[/b]、[b]限定符[/b]、[b]替换分组[/b]、[b]反向引用[/b]、[b]零宽度断言[/b]、[b]匹配选项[/b]、[b]注释[/b]、[b]优先级顺序[/b]、[b]递归匹配[/b]。
[size=small][b]2.1.1元字符[/b][/size]
元字符能够匹配一个位置集合中的一个字符,也可以匹配一个字符集合中的一个字符。相对应地,元字符被分为两种:匹配位置的元字符和匹配字符的元字符。
[b]1)匹配位置的元字符(3个)[/b]
匹配位置的元字符包括:[color=blue][b]^[/b][/color]、[color=blue][b]$[/b][/color]、[color=blue][b]\b[/b][/color]。[color=blue][b]^[/b][/color]匹配[b][u]行[/u][/b]的开头,[color=blue][b]$[/b][/color]匹配[b][u]行[/u][/b]的结尾(如^abc匹配以abc开头的行,$abc匹配以abc结尾的行,^abc$匹配以abc开始和结尾的行)。[b]注意:单个^匹配任意行,单个$匹配一个空行。
[/b][color=blue][b]\b[/b][/color]匹配[b][u]单词[/u][/b]的开始和结尾(如\babc匹配以abc开始的单词,abc\b匹配以abc结尾的单词),且要注意的一点是,[color=blue][b]\b[/b][/color]不匹配空格、标点符号和换行符号,即如果你使用了\babc,则它对以abc开头的单词后面是否有空格、标点符号或换行符号没有限制,它是可以匹配"abcdefg, hijklmn"这一字符串的。abc\b也同理。
[b]2)匹配字符的元字符(7个)[/b]
[color=blue][b].[/b][/color](点号,匹配除换行之外的任意字符)、[color=blue][b]\w[/b][/color](匹配单词字符(包括字母、汉字、下划线和数字))、[color=blue][b]\W[/b][/color](匹配任意非单词字符)、[color=blue][b]\s[/b][/color](匹配任意的空白字符,如空格、制表符、换行等)、[color=blue][b]\S[/b][/color](匹配任意的非空白字符)、[color=blue][b]\d[/b][/color](匹配任意数字字符)、[color=blue][b]\D[/b][/color](匹配任意非数字字符)。
[b]3)两种元字符类型结合举例[/b]
[color=red]^.$[/color] :匹配一个非空行,在该行中可以包含除了换行符以外的任意字符。
[color=red]\ba\w\w\w\d\d\D\b[/color] :匹配以字母a开头后面有3个字符2个数字和1个非数字字符,长度等于8的单词。
[size=small][b]2.1.2字符类[/b][/size]
字符类是一个字符集合,如果该字符集合中的[u][b]任何一个字符[/b][/u]被匹配,则它会找到该匹配项。字符类可以在[](方括号)中定义。如:[0123456789]可以匹配数字0到9中的任意一个,[Aa]bc可以匹配字符串Abc或abc。
为了方便,我们可以将[0123456789]写成[0-9],表示匹配0到9任意一个阿拉伯数字,[a-z]匹配任何小写字母,[A-Z]匹配任意大写字母。
由于以上写法,我们很自然想到,如果我们想匹配连字符"-"该怎么做呢?此时有一个规定,如果要在字符类中包含连字符,则必须包含在第一位,如:[-a]表示表达式匹配-或者a,不能写成[a-]。
注意,在字符类中如果^是字符类的第一个字符表示否定该字符串,匹配该字符串外的任意字符,如:[^abc]匹配除了abc以外的任意字符,a[^b]匹配a之后不是b的字符串。
[color=red][0-9a-z_A-Z_][/color] :匹配任何数字、字母、下划线。等同于\w。
[size=small][b]2.1.3字符转义[/b][/size]
[color=red]\r[/color] :代表回车和换行符
[color=red]\n[/color] :换行符
[color=red]\t[/color] :制表符
[color=red]\\[/color] :匹配 "\" 本身
[color=red]\^[/color] :匹配 "^" 符号本身
[color=red]\$[/color] :匹配 "$" 符号本身
[color=red]\.[/color] :匹配小数点"."本身
[size=small][b]2.1.4反义[/b][/size]
常用的反义表达式:
[color=red]\W[/color] :匹配任意不是字母,数字,下划线,汉字的字符
[color=red]\S[/color] :匹配任意不是空白符的字符
[color=red]\D[/color] :匹配任意非数字的字符
[color=red]\B[/color] :匹配不是单词开头或结束的位置
[color=red][^x][/color] :匹配除了x以外的任意字符
[color=red][^abcde][/color] :匹配除了abcde这几个字母以外的任意字符
[size=small][b]2.1.5限定符[/b][/size]
正则表达式的元字符一次只能匹配一个位置或一个字符,如果需要匹配零个一个或多个字符时,则需要使用限定符。限定符用于指定允许特定字符或字符集自身重复出现的次数。如{n}表示出现n次;{n,}表示重复至少n次;{n,m}表示至少出现n次最多m次。
常用限定符:
[color=darkred]*[/color] :匹配[b]前面的子表达式[/b]零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
[color=darkred]+[/color] :匹配[b]前面的子表达式[/b]一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
[color=darkred]?[/color] :匹配[b]前面的子表达式[/b]零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" ,但是除了这两个单词其他的都不能匹配,例如"doess"中的"do"不能匹配。? 等价于 {0,1}。
[color=darkred]{n}[/color] :n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个o。
[color=darkred]{n,}[/color] :至少匹配n 次。'a{1,}' 等价于 'a+','a{0,}' 则等价于 'a*'。
{n,m} :m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'a{0,1}' 等价于 'a?'。[b]注意:在逗号和两个数之间不能有空格。[/b]
[color=darkred]*?[/color] :尽可能少的使用重复的第一个匹配。
[color=darkred]+?[/color] :尽可能少的使用重复但至少使用一次。
[color=darkred]??[/color] :如果有可能使用零次重复或一次重复。
[color=darkred]{n}?[/color] :等同于{n}
[color=darkred]{n,}?[/color] :尽可能少的使用重复但至少重复n次
[color=darkred]{n,m}?[/color] :介于n次和m次之间,尽可能少的使用重复。
2.1.6匹配的三种类型
1)[color=darkblue][b]贪婪匹配[/b][/color]:先看整个字符串是不是一个匹配,如果没有发现匹配,它去掉字符串中最后一个字符并再次尝试,如果还没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复直到发现一个匹配或字符串不剩一个字符为止。(从整体开始,从后往前一个字符一个字符去掉进行匹配)
2)[b][color=darkblue]惰性匹配[/color][/b]:先看字符串中的第一个字母是不是一个匹配,如果单独一个字符还不够就读入下一个字符,如果还没有发现匹配,就不断地从后续字符中读取,直到发现一个合适的匹配,然后开始下一次的匹配。(one by one)
3)[color=darkblue][b]支配性匹配[/b][/color]:只尝试匹配整个字符串,如果整个字符串不能产生一个匹配,则不再进行尝试。(不作阶段性尝试)
[b]普通的字符类均是贪婪匹配,如果在字符类后加个问号(?)则表示懒惰匹配,要成为支配性匹配则在懒惰匹配后加个问号(?)。[/b]
[size=small][b]2.1.7分组[/b][/size]
分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中分组使用圆括号(),分组后把圆括号中的表达式看做一个整体来处理,比如:(abc){1,2}表示abc出现一次或两次的字符串,其中把abc看做一个整体来进行匹配。
常用分组说明:
[color=green](abc)[/color] :匹配字符串abc,并将匹配的文本保存到自动命名的组里
[color=green](?<nane> abc)[/color] :匹配字符串abc,并将匹配的文本保存到以name命名的变量中,该名称不能包含标点符号,不能以数字开头。
[color=green](?:abc)[/color] :匹配字符串abc,不保存匹配的文本,也不分配组号
[color=green](?!abc)[/color] :匹配后面不是字符串abc的位置
[color=green](?=abc)[/color] :匹配字符串abc前面的位置
[color=green](?<=abc)[/color] :匹配字符串abc后面的位置
[color=green](?<!abc)[/color] :匹配前面不是字符串abc的位置
[color=green](?>abc)[/color] :只匹配abc一次
[size=small][b]2.1.8替换[/b][/size]
[color=brown]|[/color] :匹配竖线(|)左侧或右侧。
[color=brown](?(表达式)yes|no)[/color] :表达式要么与yes部分匹配要么与no部分匹配,其中no部分可以省略。
[color=brown](?(name)yes|no)[/color] :以name命名的字符串要么与yas部分匹配,要么与no部分pp,其中no部分可以省略。
[size=small][b]2.1.9 后向引用[/b][/size]
当一个正则表达式被分组后,每一个组将自动被赋予一个组号,该组号可以代表该组的表达式。其中,组号的编制规则为:从左到右,以分组的左括号为标志,第一个组号为1,第二个分组号为2,以此类推。[b]反向引用提供了查找重复字符组的方便方法[/b],反向引用可以使用数字命名(默认)的组号,也可以使用指定命名的组号。
[b]\数字[/b] :使用数字命名的后向引用;
[b]\k<name>[/b] :使用指定命名的后向引用。
………………举例说明………………
[color=blue]\b(\w)\1\b[/color]匹配两个字符一样的单词(([b]\w)[/b]它的组号为1),[color=blue]\b(\w)\w\b[/color]匹配两个单词,这两个单词的字符可以相同也可以不相同。
[color=darkblue]\b(\w)(\d)\1\2\b[/color]匹配一个字符和一个数字然后重复和前面相同的字符和数字(([b]\w)[/b]的组号为1,[b](\d)[/b]的组号为2)。
[color=indigo]\b(\w+)\b\s+\1\b[/color]具体匹配过程如下:
a.表达式\b(\w+)\b匹配一个单词并且单词的长度至少为1;
b.表达式\s+匹配一个或多个空白字符;
c.表达式\1将重复子表达式(\w+)匹配的内容,及匹配重复的单词;
d.匹配单词的结束位置。
[size=small][b]2.1.10零宽度断言[/b][/size]
元字符^、\b、$都匹配一个位置,并且这个位置满足一定条件。在此把满足一个条件称为断言或零宽度断言。
零宽度断言说明:
[color=gray]\A[/color] :匹配必须出现在字符串的开头
[color=gray]\Z[/color] :匹配必须出现在字符串的结尾或字符串结尾处的换行符(\n)前
[color=gray]\z[/color] :匹配必须出现在字符串的结尾
[color=gray]\G[/color] :匹配必须出现在上个匹配结束的地方
[color=gray]\b[/color] :匹配单词的开始或结束的位置
[color=gray]\B[/color] :匹配不是单词的开始或结束的位置
[size=small][b]2.1.11匹配选项[/b][/size]
匹配选项可以指定正则表达式匹配中的行为,如忽略大小写、处理多行、处理单行、从右到左开始匹配等。
常用匹配选项:
[b]RegexOptions枚举值 内联标志 简单说明[/b]
ExplicitCapture n 只有定义了命名或编号的组才捕获
IgnoreCase i 不区分大小写
IgnorePatternWhitespace x 消除模式中的非转义空白并启用由#标记的注释。
MultiLine m 多行模式,其原理是修改了^和$的含义
SingleLine s 单行模式,和MultiLine相对应
[size=small][b]2.1.12优先级[/b][/size]
正则表达式计算从左到右,以下运算符从上到下优先级依次递减:
[b]运算符 说明[/b]
\ 转义符
(), (?:), (?=), [] 括号和中括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter, anycharacter 定位点和序列
| 替换
[size=medium][b]2.2正则表达式在java中的使用[/b][/size]
java.util.regex中包括了两个类:Pattern和Matcher,这两个类都是终态类,并且没有定义相关接口。一个Pattern对象就是一个正则表达式经编译后的表现模式,称为“模式编译器”;一个Matcher对象是一个状态机器,它根据Pattern对象作为匹配模式对字符串展开匹配检查,称为“模式匹配器”。因为模式的编译过程是最先进行且与匹配过程独立的,所以这保证了进行批量字符串匹配时候的运行效率。
Pattern类有如下重要的方法:
(1)public static Pattern compile(String regex):将给定的正则表达式编译并返回编译后的Pattern对象。
(2)public static Pattern compile(String regex, int flags):将给定的正则表达式编译并返回编译后的Pattern对象,flag参数表示匹配时的选项,可选的flag参数包括:CASE_INSENSITIVE,COMMENTS,MULTILINE,DOTALL,UNICODE_CASE,CANON_EQ。
(3)public int flags():返回flag选项参数。
(4)public static boolean matches(String regex, CharSequence input):直接判断字符序列input是否匹配正则表达式regex。前面曾经提到当需要使用一个正则表达式进行多次匹配的时候,对正则表达式进行预编译能够加快运行速度,但是如果这个匹配只进行一次的话,就可以调用这个matches方法直接判断是否匹配。这段代码内部的实现代码是:Pattern.compile(regex).matcher(input).matches();
Matcher 类有如下重要的方法:
(1)public boolean matches():生成一个给定命名的Matcher对象
(2)public String pattern():返回该Pattern对象所编译的正则表达式。
(3)public String[] split(CharSequence input):将目标字符序列input按照Pattern里所包含的正则表达式为模式进行分割。
(4)public String[] split(CharSequence input, int limit) 将目标字符序列input按照Pattern里所包含的正则表达式为模式进行分割,参数limit作用是指定要分割的段数,如将limi设为2,那么目标字符序列将根据正则表达式分为割为两段。
(5)public String group(int group) :得到匹配结果中提取的第group个分组的值。此方法在字符串提取中经常用到。
(6)public String replaceAll(String replacement):用指定的字符串替换匹配的子串。
find()方法用来搜索与正则表达式相匹配的任何目标字符串,group()方法用来返回包含了所匹配文本的字符串。
实例:
public boolean RE_Match(){
String str="CF020522-1110";
String regEx="^[A-Z]{2}[0-9]{6}[-][0-9]{4}$";
Pattern p= Pattern.compile(regEx);
Matcher m=p.matcher(str);
boolean result=m.matches();
return result;
}

运行结果返回true。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值