正则表达式

一、正则表达式语法

想要灵活运用正则表达式,必须了解其中各种元字符功能,元字符从功能上大致分为:
1.限定符 2.选择匹配符 3.分组组合和反向引用符 4.特殊字符 5.字符匹配符 6.定位符

元字符-转义号\
\符号: 在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错。
需要用到转义符号的字符有以下: .*+()$/?[]^{}
注意:在Java中,两个\代表其他语言的一个
元字符-字符匹配符

符号 含义 实例 解释
[] 可接受的字符列表 [efgh] e、f、g、h中的任意一个字符
[^] 不接受的字符列表 【^abc】 除a、b、c之外的任意一个字符,包括数字和特殊符号
- 连字符 A-Z 任意单个大写字母
. 匹配除\n意外的任何字符 a…b 以a开头,b结尾中间包括2个任意字符的长度为4的字符串(aaab,aefb,a34b,a#%b)
\\d 匹配单个数字字符,相当于[0-9] \\d{3}(\\d)? 包含三个或者四个数字的字符串(123,8873)
\\D 匹配单个非数字字符,相当于[^0-9] \\D(\\d)* 以单个非数字字符开头,后接任意个数字字符串(a,A342)
\\w 匹配单个数字、大小写字母字符和下划线,相当于[0-9a-zA-Z] \\d{3}\\w{4} 以3个数字字符开头的长度为7的数字字母字符串(234abcd,12345fe)
\\W 匹配单个非数字、大小写字母字符和下划线,相当于[^0-9a-zA-Z] \\W+\\d{2} 以至少一个非数字字母字符开头,2个数字字符结尾的字符串(#29,#?@10)

java正则表达式默认区分字母大小写,如何实现不区分大小写?
(?i)表示abc都不区分大小写
a(?i)bc表示bc不区分大小写
a((?i)b)c表示只有b不区分大小写

元字符-选择匹配符
在匹配某个字符串的时候是选择性的,即:可以匹配这个也可以匹配那个

符号 含义 实例 解释
l 匹配“l”之前或之后的表达式 ablcd ab或者cd

元字符-限定符
用于指定其前面的字符和组合项连续出现多少次

符号 含义 实例 解释
* 指定字符重复0次或n次(无要求) (abc)* 仅包含任意个abc的字符串,等效于\w*(abc,abcabcabc)
+ 指定字符重复1次或n次(至少一次) m+(abc)* 以至少一个m开头,后面接任意个abc的字符串(m,mabc,mabcabc)
指定字符重复0次或一次(最多一次)。当?紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后,匹配模式是非贪心的,会搜索到尽可能短的字符串 m+abc? 以至少一个m开头,后接ab或abc(m,mabc,mmab,mmabc)
{n} 只能输入n个字符 [abcd]{3} 由abcd中字母组成的任意长度为3的字符串(abc,dbc,adc)
{n,} 指定至少n个匹配 [abcd]{3,} 由abcd中字母组成的任意长度不小于3的字符串(aab,dbc,aaabdc)
{n,m} 指定至少n个但不多于m个匹配 [abcd]{3,5} 由abcd中字母组成的任意长度不小于3,不大于5的字符串(abc,abcd,aaaaa,bcdab)

在java中{n,m}会优先匹配多的,比如用a{3,4}匹配字符串aaaa,会匹配到aaaa而不是aaa

元字符-定位符
定位符,规定要匹配的字符串出现的位置,比如在字符串的开始还是结束的位置

符号 含义 实例 解释
^ 指定起始字符 ^【0-9】+【a-z】* 由至少一个数字开头,后接任意个小写字母(123,6aa,555efa)
$ 指定结束字符 ^【0-9】\\-【a-z】+$ 以1个数字开头后接连字符“-”,并以至少一个小写字母结尾的字符串(1-a)
\\b 匹配目标字符串的边界 han\\b 这里说的字符串的边界指的是字串间有空格,或者目标字符串结束的位置(sphan,nnhan)
\\B 匹配目标字符串的非边界 han\\B 与\\b意思相反(hannn)

分组

常用分组构造形式 说明
(pattern) 非命名捕获。捕获匹配的子字符串。编号为0的第一个捕获是由整个正则表达式模式匹配的文本,其他捕获结果则根据左括号的顺序从1开始自动编号
(? pattern) 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如(?‘name’)
(?:pattern) 匹配pattern但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配,这对于用“or”字符(|)组合模式部件的情况很有用,例如‘industr(?:y|ies)’是比industry|industries更经济的表达式
(?=pattern) 它是一个非捕获匹配。例如‘Windows(?=95|98|NT|2000)’只匹配Windows 2000中的Windows,但是不匹配Windows 3.1中的Windows
(?!pattern) 该表达式匹配不处于匹配pattern的字符串的起始点的搜索字符串。它是一个非捕获匹配。例如‘Windows(?=95|98|NT|2000)’匹配Windows 3.1中的Windows,但是不匹配Windows 2000中的Windows

二、应用实例

1、汉字
^[\u0391-\uffe5]+$
2.邮政编码(1-9开头的六位数字)
^[1-9]\\d{5}$
3、qq号(1-9开头的一个5-10位数)
^[1-9]\\d{4,9}$
4、手机号码(以13,14,15,18开头的11位数字)
^1[3|4|5|8]\\d{9}$
5.验证URL地址
(1)url都是以http://或者https://开头
^((http|https)://)
(2) 域名部分,都是字母数字和下划线还有-,其中有.
([\\w-]+\\.)+[\w-]+
(3)域名之后部分(有或没有,最后加个?),斜杠开头,之后是字母数字下划线-?=&/%.#符号,可能有多个,最后加*
(\\/[\\w-?=&/%.#])?$
(4)最后结果:^((http|https)://)([\\w-]+\\.)+[\w-]+(\\/[\\w-?=&/%.#]
)?$

三、java正则表达式三个常用类

三个类都在java.util.regex包下
Pattern
pattern对象是一个正则表达式对象,pattern类无公共构造方法,需要创建一个Pattern对象调用公共静态方法,返回一个Pattern对象。该方法接受一个正则表达式作为它的第一个参数。
Pattern r=Pattern.compile(pattern);
Matcher
Matcher对象是对输入字符串进行解释和匹配的引擎,也无公共构造,需要通过静态的matcher方法来获得对象
PatternSyntaxException
是一个非强制异常类,它表示一个正则表达式模式中的语法错误

四、分组、捕获、方向应用

1、分组
我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看作一个子表达式/一个分组
2.捕获
把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。组0代表的是整个正则表达式
3.反向引用
圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部方向引用\\分组号,外部反向引用$分组号
实例
匹配两个连续的相同数字:(\\d)\\1
匹配五个连续的相同数字:(\\d)\\1{4}
匹配个位与千位相同,十位与百位相同的数字(四位回文数):(\\d)(\\d)\\2\\1

你可能感兴趣的:(Linux,正则表达式)