一、正则表达式是什么
正则表达式是一种字符串匹配的模式,你也可以理解为定义了一种模板,这个模板可以“筛选”出符合它要求的字符串。如果给定了一段字符串,你可以对它进行特定字符串的查找和替换等一系列动作。正则表达式的重点是匹配,就像灰姑娘的水晶鞋,只有和灰姑娘脚大小相同的人才能穿进去,因为两者相匹配。
二、正则表达式怎样使用
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种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、...
Java正则表达式是Java编程语言中用于处理字符串的强大工具,它允许程序员通过模式匹配来查找、替换或分割文本。...阅读《JAVA正则表达式实例教程.pdf》将帮助你更全面地理解和掌握Java正则表达式。
- 通过实例演示如何构建正则表达式,如匹配邮箱地址:`\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*`。 - 解析复杂表达式的匹配逻辑,帮助理解各个部分的作用。 综上所述,"正则表达式PPT、示例讲解"这份资料将...
本书讲解了基于8种常用的编程语言使用正则表达式的经典实例。书中提供了上百种可以在实战中使用的实例,以帮助读者使用正则表达式来处理数据和文本。对于如何使用正则表达式来解决性能不佳、误报、漏报等常见的错误...
标题和描述均提到了“正则表达式经典实例”,这暗示了文档可能包含了一系列与正则表达式相关的示例和应用场景。正则表达式(Regular Expression)是一种强大的文本处理工具,用于模式匹配、搜索和替换字符串中的特定...
《正则表达式经典实例》这本书中,作者通过丰富的实例讲解了这些概念,并提供了实践指导,无论你是初学者还是有经验的开发者,都能从中受益。阅读这本书,你将能够更好地掌握正则表达式这一强大的工具,解决实际工作...
本讲解将深入探讨Java正则表达式的概念、语法以及常见用法。 ### 1. 正则表达式基础 正则表达式(Regular Expression)是一种模式,用来匹配一系列字符串。在Java中,字符串与正则表达式之间的操作主要由`Pattern`...
虽然这并不是一篇完整的教程,但它提供了一系列实用的正则表达式实例,如用于判断电子邮件地址、QQ号码、身份证号码格式等。对于需要在实际项目中运用正则表达式的开发者来说,这些实例是非常有价值的参考资料。 ##...
本资源是 Tcl/tk 进阶资料,主要讲解正则表达式的概念和使用方法,通过作者的实践经验和实例讲解,非常易于理解和应用于实际开发中。 知识点一:正则表达式的历史和应用 * 正则表达式的历史可以追溯到 1956 年,...
在Linux Shell环境中,正则表达式常与grep、sed、awk等命令结合使用,以实现高效的数据筛选和处理。 1. 元字符:正则表达式的核心是元字符,它们具有特殊的含义。例如,`.`表示任意单个字符,`^`表示行首,`$`表示...
4. **正则表达式实例** - 验证邮箱格式:`/^\S+@\S+\.\S+$/`,确保字符串包含有效的电子邮件地址格式。 - 验证手机号码:`/^1[3-9]\d{9}$/`,匹配中国大陆的11位手机号码。 - 密码强度验证:`/^(?=.*\d)(?=.*[a-...
这本书的第三版深入浅出地讲解了正则表达式的原理、语法和应用,是许多开发者学习和提升正则表达式技能的重要参考资料。 正则表达式,简称正则或regex,是一种模式匹配语言,广泛应用于文本处理、数据验证、搜索和...
8. **正则表达式库**:书中还讨论了不同编程语言中的正则表达式库,如Java的java.util.regex和Python的re模块,以及如何在这些库中使用正则表达式。 9. **正则表达式设计原则**:最后,作者提出了正则表达式设计的...
8. **实例解析**:提供大量实际例子,帮助学习者通过实践理解正则表达式的使用,例如在文本编辑器、命令行工具和编程语言中的应用。 9. **高级话题**:可能包括正则表达式在文本处理、数据验证、爬虫和搜索引擎优化...
《易语言“正则表达式”教程》是一份详尽的文档,旨在帮助易语言使用者理解和掌握正则表达式这一强大的文本处理工具。正则表达式(Regular Expression)在编程和文本处理领域中广泛应用于数据查找、替换和验证,无论...
本教程将深入讲解正则表达式的基础概念、语法以及在Java中的应用。 一、正则表达式基础 1. **概念**:正则表达式(Regular Expression)是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的字符串,...