Lab3因而起——对正则表达式的学习(一)

Lab3因而起——对正则表达式的学习(一)

在本次lab3实验中的正则表达式部分,对于从没学过正则表达式的小伙伴来说,可以说是困难重重,而我恰好属于其中之一,课堂上对正则表达式的接触皮毛显然没能满足这次实验对我的要求,不多说,开始学习!

  • 一、正则表达式

在java中,字符串操作主要集中于String,StringBuffer和StringTokenizer类,与正则表达式相比较,他们只能提供相当简单的功能。正则表达式是一种强大而灵活的文本处理工具。使用正则表达式,我们能能够以编程的方式构造更多复杂的文本模式,并对输入的字符串进行搜索。一旦找到了匹配模式的部分,就能随心所欲的对他们进行处理。

  • 二、一点点的了解

在java中,和其他语言的正则表达式不甚相同,主要是由于jav对反斜线\的处理不同。在java中,\的意思式“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊的意义”,例如要表示一个数字,那正则表达式应该好似\d。因此要想插入一个普通的反斜线应该是\\。不过换行和制表符之类的只需要用单反斜线就够了。
用+表示“一个或多个之前的表达式”,例如:表达“可能有一个负号,后面隔着一位或多位数字”,即:-?\+
而如果要检查一个字符串是否匹配字符表达式,可以用到函数match,例:“-1234”.matches(“-?\d+”);
而这是后就有疑问了,既然+号可以用来表示“一个或多个之前的表达式”,那么当我像表示一个正数的时候可以怎么样呢?可以用\对+进行转义,从而得到我们需要的表达式中的一个普通字符,例如:(-|\+)?,表达的是“可能以一个加号或者减号开头”,在这里面,|的意思是或者,即同时只可能出现或关系的其中之一,而括号有着将表达式分组的效果。

  • 三、常用的正则表达式

字符
\t 横向制表符
\n 换行符
\f 换页
\e 转义
\r 回车

字符类
. 任意字符
[abc] 即a|b|c
[^abc] 除了a\b\c以外的其它字符
[a-zA-z] 从a到z或从A到Z的任何字符
[abc[ijk]] a|b|c|i|j|k
\s 空白符(即字符里的五类)
\S [^\s]
\d [0-9]
\D [^\d]
\w [a-zA-Z0-9]
\W [^\w]
对于字符类的记忆也较为轻松,只需要明白[]里的作用以及几个\符号的作用即可,且大写字母总是小写字母的非的含义。
逻辑操作符
XY Y跟着X
X|Y X或Y
(X) 捕获组(在lab3应用时会讲解)

量词:
贪婪型:量词总是贪婪的,贪婪表达式会为所有可能的模式发现更多的匹配。假定模式仅能匹配第一个可能的字符组,如果他是贪婪的,他会继续往下匹配。
勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数。
占有型:这是只有java中才有的。当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败时回溯。而“占有”量词不保存这些中间状态,因此它可以防止回溯,常常用于防止正则表达式失控,因此可以使正则表达式执行起来更有效。
贪婪型 勉强型 占有型 匹配方式
X? X?? X?+ 一个或零个X
X* X*? X*+ 零个或多个X
X+ X+? X++ 一个或多个X
X{n} X{n}? X{n}+ n次X
X{n,} X{n,}? X{n,}+ 至少n次X
X{n,m} X{n,m}? X{n,m}+ n-m次X

  • 四、lab3中的实战

首先给出一个正则表达式选哟匹配的样本实例:

对于一系列的数据输入,从初学来讲,一行一行的首先分析
1)Flight:2020-01-16,AA018
对于Flight:由于这个部分没有可变性,直接用“Flight:”进行匹配即可
对于日期“xxxx-xx-xx”应采用上面所学到的正则表达式的方式进行设计
首先x在第一个“-”之前出现了4次,即“[0-9]{4}”同理得“xxxx-xx-xx”匹配模式应该是([0-9]{4})-((0[0-9])|(1[0-2]))-((3[0-1])|([1-2][0-9])|(0[1-9]))
对于后来的航班号应该用两个大写字母和数字表示,根据大多数据的观察,最终设计为([A-Z]{2}[0-9]{2}[0-9]?[0-9]?)
将他们合起来为:
Flight:(([0-9]{4})-((0[1-9])|(1[0-2]))-((3[0-1])|([1-2][0-9])|(0[1-9]))),([A-Z]{2}[0-9]{2}[0-9]?[0-9]?)
2)有关‘{’
根据上述所学,需要\进行转义,所以是’\{‘;
3)DepartureAirport:Hongkong、ArrivalAirport:Shenyang
由于DepartureAirport:与ArrivalAirport:固定,故主要设计后面的地点即([A-Z][a-z])
最后整合为DepartureAirport:([A-Z][a-z]
) ArrivalAirport:([A-Z][a-z]*)
4)DepatureTime:2020-01-16 22:40、ArrivalTime:2020-01-17 03:51
有了上面的设计经验,得知,这里主要设计的是时间 “xx-xx”
根据正则表达设计为:((2[0-4]|([0-1][0-9])):[0-5][0-9]))
合并得:
DepatureTime:(([0-9]{4})-((0[1-9])|(1[0-2]))-((3[0-1])|([1-2][0-9])|(0[1-9])) ((2[0-4]|([0-1][0-9])):[0-5][0-9]))
ArrivalTime:(([0-9]{4})-((0[1-9])|(1[0-2]))-((3[0-1])|([1-2][0-9])|(0[1-9])) ((2[0-4]|([0-1][0-9])):[0-5][0-9]))
5)Plane:B6967\Type:A340\Seats:332\Age:23.7
以Plane设计为例:Plane:((B|N)[0-9]{4})\n\{\nType:([a-z]|([A-Z])([0-9]+))
6)有关符号 ‘}’
与符号‘{’设计相同,’\}‘。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值