`
天之娇子zjn
  • 浏览: 14942 次
  • 性别: Icon_minigender_2
  • 来自: 长沙
社区版块
存档分类
最新评论

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

    博客分类:
  • Java
阅读更多
一、正则表达式是什么
    正则表达式是一种字符串匹配的模式,你也可以理解为定义了一种模板,这个模板可以“筛选”出符合它要求的字符串。如果给定了一段字符串,你可以对它进行特定字符串的查找和替换等一系列动作。正则表达式的重点是匹配,就像灰姑娘的水晶鞋,只有和灰姑娘脚大小相同的人才能穿进去,因为两者相匹配。
二、正则表达式怎样使用
2.1  ------基础知识------
   我们首先介绍一下正则表达式的一些基础知识,这些理论知识将为编写正则表达式提供法则和规范,主要包括:元字符字符类字符转义反义限定符替换分组反向引用零宽度断言匹配选项注释优先级顺序递归匹配
2.1.1元字符
    元字符能够匹配一个位置集合中的一个字符,也可以匹配一个字符集合中的一个字符。相对应地,元字符被分为两种:匹配位置的元字符和匹配字符的元字符。
1)匹配位置的元字符(3个)
    匹配位置的元字符包括:^$\b^匹配的开头,$匹配的结尾(如^abc匹配以abc开头的行,$abc匹配以abc结尾的行,^abc$匹配以abc开始和结尾的行)。注意:单个^匹配任意行,单个$匹配一个空行。
   
\b匹配单词的开始和结尾(如\babc匹配以abc开始的单词,abc\b匹配以abc结尾的单词),且要注意的一点是,\b不匹配空格、标点符号和换行符号,即如果你使用了\babc,则它对以abc开头的单词后面是否有空格、标点符号或换行符号没有限制,它是可以匹配"abcdefg, hijklmn"这一字符串的。abc\b也同理。
2)匹配字符的元字符(7个)
    .(点号,匹配除换行之外的任意字符)、\w(匹配单词字符(包括字母、汉字、下划线和数字))、\W(匹配任意非单词字符)、\s(匹配任意的空白字符,如空格、制表符、换行等)、\S(匹配任意的非空白字符)、\d(匹配任意数字字符)、\D(匹配任意非数字字符)。
3)两种元字符类型结合举例
    ^.$ :匹配一个非空行,在该行中可以包含除了换行符以外的任意字符。
    \ba\w\w\w\d\d\D\b :匹配以字母a开头后面有3个字符2个数字和1个非数字字符,长度等于8的单词。
2.1.2字符类
    字符类是一个字符集合,如果该字符集合中的任何一个字符被匹配,则它会找到该匹配项。字符类可以在[](方括号)中定义。如:[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的字符串。
    [0-9a-z_A-Z_] :匹配任何数字、字母、下划线。等同于\w。
2.1.3字符转义
\r :代表回车和换行符
\n :换行符
\t :制表符
\\ :匹配 "\" 本身
\^ :匹配 "^" 符号本身
\$ :匹配 "$" 符号本身
\. :匹配小数点"."本身
2.1.4反义
常用的反义表达式:
\W :匹配任意不是字母,数字,下划线,汉字的字符
\S :匹配任意不是空白符的字符
\D :匹配任意非数字的字符
\B :匹配不是单词开头或结束的位置
[^x] :匹配除了x以外的任意字符
[^abcde] :匹配除了abcde这几个字母以外的任意字符
2.1.5限定符
    正则表达式的元字符一次只能匹配一个位置或一个字符,如果需要匹配零个一个或多个字符时,则需要使用限定符。限定符用于指定允许特定字符或字符集自身重复出现的次数。如{n}表示出现n次;{n,}表示重复至少n次;{n,m}表示至少出现n次最多m次。
常用限定符:
* :匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。
+ :匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。
? :匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" ,但是除了这两个单词其他的都不能匹配,例如"doess"中的"do"不能匹配。? 等价于 {0,1}。
{n} :n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个o。
{n,} :至少匹配n 次。'a{1,}' 等价于 'a+','a{0,}' 则等价于 'a*'。
{n,m} :m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'a{0,1}' 等价于 'a?'。注意:在逗号和两个数之间不能有空格。
*? :尽可能少的使用重复的第一个匹配。
+? :尽可能少的使用重复但至少使用一次。
?? :如果有可能使用零次重复或一次重复。
{n}? :等同于{n}
{n,}? :尽可能少的使用重复但至少重复n次
{n,m}? :介于n次和m次之间,尽可能少的使用重复。
2.1.6匹配的三种类型
1)贪婪匹配:先看整个字符串是不是一个匹配,如果没有发现匹配,它去掉字符串中最后一个字符并再次尝试,如果还没有发现匹配,那么再次去掉最后一个字符,这个过程会一直重复直到发现一个匹配或字符串不剩一个字符为止。(从整体开始,从后往前一个字符一个字符去掉进行匹配)
2)惰性匹配:先看字符串中的第一个字母是不是一个匹配,如果单独一个字符还不够就读入下一个字符,如果还没有发现匹配,就不断地从后续字符中读取,直到发现一个合适的匹配,然后开始下一次的匹配。(one by one)
3)支配性匹配:只尝试匹配整个字符串,如果整个字符串不能产生一个匹配,则不再进行尝试。(不作阶段性尝试)
    普通的字符类均是贪婪匹配,如果在字符类后加个问号(?)则表示懒惰匹配,要成为支配性匹配则在懒惰匹配后加个问号(?)。
2.1.7分组
    分组又称为子表达式,即把一个正则表达式的全部或部分分成一个或多个组。其中分组使用圆括号(),分组后把圆括号中的表达式看做一个整体来处理,比如:(abc){1,2}表示abc出现一次或两次的字符串,其中把abc看做一个整体来进行匹配。
常用分组说明:
(abc) :匹配字符串abc,并将匹配的文本保存到自动命名的组里
(?<nane> abc) :匹配字符串abc,并将匹配的文本保存到以name命名的变量中,该名称不能包含标点符号,不能以数字开头。
(?:abc) :匹配字符串abc,不保存匹配的文本,也不分配组号
(?!abc) :匹配后面不是字符串abc的位置
(?=abc) :匹配字符串abc前面的位置
(?<=abc) :匹配字符串abc后面的位置
(?<!abc) :匹配前面不是字符串abc的位置
(?>abc) :只匹配abc一次
2.1.8替换
| :匹配竖线(|)左侧或右侧。
(?(表达式)yes|no) :表达式要么与yes部分匹配要么与no部分匹配,其中no部分可以省略。
(?(name)yes|no) :以name命名的字符串要么与yas部分匹配,要么与no部分pp,其中no部分可以省略。
2.1.9 后向引用
    当一个正则表达式被分组后,每一个组将自动被赋予一个组号,该组号可以代表该组的表达式。其中,组号的编制规则为:从左到右,以分组的左括号为标志,第一个组号为1,第二个分组号为2,以此类推。反向引用提供了查找重复字符组的方便方法,反向引用可以使用数字命名(默认)的组号,也可以使用指定命名的组号。
\数字 :使用数字命名的后向引用;
\k<name> :使用指定命名的后向引用。
………………举例说明………………
\b(\w)\1\b匹配两个字符一样的单词((\w)它的组号为1),\b(\w)\w\b匹配两个单词,这两个单词的字符可以相同也可以不相同。
\b(\w)(\d)\1\2\b匹配一个字符和一个数字然后重复和前面相同的字符和数字((\w)的组号为1,(\d)的组号为2)。
\b(\w+)\b\s+\1\b具体匹配过程如下:
a.表达式\b(\w+)\b匹配一个单词并且单词的长度至少为1;
b.表达式\s+匹配一个或多个空白字符;
c.表达式\1将重复子表达式(\w+)匹配的内容,及匹配重复的单词;
d.匹配单词的结束位置。
2.1.10零宽度断言
    元字符^、\b、$都匹配一个位置,并且这个位置满足一定条件。在此把满足一个条件称为断言或零宽度断言。
零宽度断言说明:
\A :匹配必须出现在字符串的开头
\Z :匹配必须出现在字符串的结尾或字符串结尾处的换行符(\n)前
\z :匹配必须出现在字符串的结尾
\G :匹配必须出现在上个匹配结束的地方
\b :匹配单词的开始或结束的位置
\B :匹配不是单词的开始或结束的位置
2.1.11匹配选项
    匹配选项可以指定正则表达式匹配中的行为,如忽略大小写、处理多行、处理单行、从右到左开始匹配等。
常用匹配选项:
RegexOptions枚举值   内联标志   简单说明
ExplicitCapture         n       只有定义了命名或编号的组才捕获
IgnoreCase              i       不区分大小写
IgnorePatternWhitespace x       消除模式中的非转义空白并启用由#标记的注释。
MultiLine               m       多行模式,其原理是修改了^和$的含义
SingleLine              s       单行模式,和MultiLine相对应
2.1.12优先级
   正则表达式计算从左到右,以下运算符从上到下优先级依次递减:
运算符                               说明
\                                       转义符
(), (?:), (?=), []                      括号和中括号
*, +, ?, {n}, {n,}, {n,m}               限定符
^, $, \anymetacharacter, anycharacter   定位点和序列
|                                       替换
2.2正则表达式在java中的使用
    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。
分享到:
评论

相关推荐

    正则表达式经典实例

    《正则表达式经典实例》讲解了基于8种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报...

    正则表达式经典实例.pdf

    本书讲解了基于8种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误...

    正则表达式经典实例.(美)高瓦特斯,(美)利维森.pdf

    本书讲解了基于8种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误...

    正则表达式经典实例中文版 (美)高瓦特斯

    《正则表达式经典实例》讲解了基于8种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报...

    正则表达式实例,实例的好东西

    正则表达式实例,比较实用,比较全面,讲解正则表达式的使用实例,介绍此用户

    Python正则表达式完全讲解

    Python正则表达式完全讲解 很好的讲解 有实例

    .net正则表达式如何处理嵌套结构

    实例讲解 .net处理嵌套结构的方法: 如何使用正则表达式处理句法分析树 使用正则表达式处理句法分析树实例

    vba正则表达式基础

    vba正则表达式基础知识介绍,由浅入深,实例讲解

    Java正则表达式大全

    详细讲解java中有关正则表达式的应用,附带使用实例。

    java-regex正则表达式

    本文当是java正则表达式实例教程,从入门语法开始,结合源代码实例,详细讲解了java正则表达式用法和相关细节

Global site tag (gtag.js) - Google Analytics