暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

正则表达式概述

羿起小憩 2021-08-17
449

1. 正则表达式作用 

  • 检查文本中是否含有指定的特征词

  • 找出文中匹配特征词的位置

  • 从文本中提取信息,比如:字符串的子串

  • 修改文本


2. 正则表达式常用规则

1. 简单的转义字符

表达式

说明

例子

\r\n

回车换行符


\t

制表符

代表Tab(0x09)

\\

代表”\”本身

"c:\\":表示"c:\"

\^

代表^本身

"x\^2":表示"x^2"

\$

代表$本身

"30\$":表示"30$ "


2. 代表抽象意义的特殊符号

抽象意义的符号本身不匹配任何字符,它要求匹配的位置。

表达式

说明

例子

^

从字符串头部进行匹配。要匹配"^" 字符本身,使用"\^"

"^[a-zA-Z]": 匹配以大小写字母开头的字符串

$

从字符串尾部进行匹配。要匹配"$" 字符本身,使用"\$"

"^.{3}$"三个任意字符结尾

\b

匹配一个单词边界

"\btest\b"只匹"test",不会匹配"tester"

|

左右两边表达式直接的关系,匹配左边或者右边。匹配"|" 本身,使用"\|"

"IBM Notes│Lotus Notes": 匹配含有"IBM Notes" 或者 "Lotus Notes" 的字符串

()

(1)在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰(2)取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到。要匹配小括号,使用"\(" "\)"

"Inbox(\(\d+\))?":匹配"Inbox""Inbox(1) ""Inbox(15) "等等;

[]

用来自定义能够匹配'多种字符' 的表达式。要匹配中括号,请使用"\[" "\]"

" [abc] ": 匹配abc

{}

修饰匹配次数的符号。要匹配大括号,请使用"\{" "\}"

"ab{2,5}"要求a后面可以有2-5b("abbb", "abbbb", or "abbbbb")

.

匹配除了换行符(\n)以外的任意一个字符。要匹配小数点本身,请使用"\."

"a.[0-9]"一个a加一个字符再加一个09的数字;

" [\n.] ":包括\n在内的任意字符

?

修饰匹配次数为0 次或1 次。要匹配"?" 字符本身,请使用"\?"

"ab?":和ab{0,1}同义,可以没有或者只有一个b("a","ab")

+

修饰匹配次数为至少1 次。要匹配"+" 字符本身,请使用"\+"

"ab+":和ab{1,}同义,匹配以a开头,但最少要有一个b存在 ("ab", "abbb")

*

修饰匹配次数为0 次或任意次。要匹配"*" 字符本身,请使用"\*"

"ab*":和ab{0,}同义,匹配以a开头,后面可以接0个或者nb组成的字符串("a", "ab", "abbb")

3. 匹配多种字符的特殊符号

表达式

说明

例子

\d

匹配0~9中的任意一个数字,相当于[0-9]

"^\d{18}|\d{15}$":验证身份证号码

\D

匹配所有的非数字字符,等价于[^0-9]

"\D+":匹配"IBM Notes 9.0"中的"IBM Notes"

\w

任意一个字母(AZaz)或任意一个数字(09)或下划线(_)

"\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)*":匹配邮箱地址

\W

匹配所有的字母、数字、下划线以外的字符

"\W"匹配"50%"中的"%"

\s

匹配空白字符中的任意一个(包括空格,制表符,换页符等)

"\s\w*"匹配"IBMNotes"中的"Notes"

\S

匹配所有非空白字符

"\S\w*"匹配"IBMNotes"中的"IBM"

4. 表示匹配次数的特殊符号

表达式

说明

例子

{n}

表达式重复n次,

"a{5}":相当于"aaaaa"

{m,n}

表达式至少重复m次,最多重复n

"ba{1,3}":可以匹配"ba""baa""baaa"

{m,}

表达式至少重复m

"\w\d{2,}":可以匹配"a12", "_456","a12344"等等


3. PatternMatcher的应用

在频繁使用正则表达式的场合,可以用Patterncomplier方法对字符串进行剖析,验证,确定正则表达式语法无误,再对字符串进行匹配和比较,这样有助于提高效率。

 

Pattern p1 = Pattern.compile(".*<tr.*>TESTCASE RESULT:\\s*
(\\w.*? )\\s*:\\s*([A-Z\\s]+?)<.*/tr>.*", Pattern.DOTALL) ;
String matchString = "TESTCASE RESULT: testcase_gvt.teamroomx1.teamrm1: PASSED"


String result = "";
String name = "";
Matcher m1 = p1.matcher(matchString);
if(m1.find()){
name = m1.group(1);
      result = m1.group(2);
}


 

代码中的group是指里用括号括起来的,能被后面的表达式调用的正则表达式。

  • group 0 表示整个表达式

  • group 1表示第一个被括起来的group,以此类推。

  •  A(B(C))D里面有三个group:group 0是ABCD, group 1是BC,group 2是C。

 

4. ASCII控制字符的匹配

\\p{Cntrl} 表示控制字符



int[][] asciis = {{0,20}, {3, 0, 1, 0, 0, 0, 32, 5}};
String matchedStr = ascii2String(asciis[0]) + "Test ABC efg" + ascii2String(asciis[1]) + "End\n";
String pattern = "^\\p{Cntrl}{2}([A-Za-z\\s]+)(\\p{Cntrl}{1,})(\s\\p{Cntrl}End\n)$";
Matcher keyMatcher = Pattern.compile(pattern).matcher(matchedStr);
if (keyMatcher.find()) {
   System.out.println(keyMatcher.group(0));
   System.out.println(keyMatcher.group(1));
   System.out.println(str2Ascii(keyMatcher.group(2)));
   System.out.println(str2Ascii(keyMatcher.group(3)));
 }



group0: Test ABC efg End


group1: Test ABC efg
group2: [3, 0, 1, 0, 0, 0]
group3: [32, 5, 69, 110, 100, 10]


文章转载自羿起小憩,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论