正则表达式

一、为什么写
这次在写软件构造实验3的时候有一个需求是使用正则表达式来匹配字符串,我觉得还挺有用的,所以想简单地讲一下。

二、正则表达式
首先简单介绍几个符号。
① x::= yz
x匹配yz
②x::= y*
x匹配0个y或若干个y
③x::= y | z
x匹配y或z
④x:: = (y z |a b)*
x匹配zero或若干个yz或若干个ab
⑤x::= a (b|c) d
x匹配a (b或c) d
⑥x::= y?
x匹配空或1个y
⑦x::= y+
x匹配1个或多个y,等价于x::= y y*
⑧x::= [a-c]
x匹配a,b,c中的一个,等价于x::= ‘a’|’b’|’c’
⑨x::= [ac]
x匹配a或c中的一个,等价于x::=’a’|’c’
⑩x::= [^a-c]
x匹配字母表里除了a,b,c,剩下中的一个,等价于x::=’d’|’e’…|’z’

对于这些字符的优先级:
*,?,+的优先级最高,然后是连接符空格,最后是’|’。

三、终结符和非终结符
在这里插入图片描述
我们来观察上述的式子。
简单的讲,非终结符是指’=’左边的字符。终结符指’=’右边的除非终结符。递归的符号指’=’左右都出现在一个式子里。
故我们可以发现:
非终结符: S B C
终结符: T M P E
递归的: B

四、实际例子
①我要对一个三位数进行匹配,要求百位的范围是1-4,十位的范围是5-7,个位的范围是8-9。
在这里插入图片描述
这是我们编写的正则表达式,然后进行测试。
在这里插入图片描述
测试通过。

②对于一串数字,我只知道他的个位数是1-5,别的不知道。
在这里插入图片描述
这是编写的正则表达式,由于我并不清楚这个数的位数,所以前面的[1-9]应为’*’。
在这里插入图片描述
测试通过。

③跟②条件相同,如果确实位数不为1。
在这里插入图片描述
此时我们准确地写就应该把’*’改为’+’。
在这里插入图片描述
此时则无法匹配’5’。

这里我将介绍一些简便写法,比如\.指匹配字符’.’。而一些简便写法比如说\d{4},指匹配4位的数字。[1-5][1-2]{5}指匹配第一位是1-5,后五位是1-2.接下来给上例子。

④匹配一个小数
首先分析问题,一个小数有可能整数位非0,也可能是0.而小数位则无所谓。并且整数位为0的话我应该出现’000.1’的情况,而应该是’0.1’。而’1.000’和’1.0’都是合法的写法,故对于小数位不做要求。
在这里插入图片描述
这是编写的正则表达式,将规则分成2种情况,一种整数为0,一种整数非0.

⑤匹配一个600以内的正整数数字
对这个需求进行分析,可以简单地分成3部分,600,100-599,0-99。
在这里插入图片描述
这是编写的正则表达式
在这里插入图片描述
运行通过

在这里插入图片描述
接下来是做实验的时候需要匹配的一个需求:
进行分析,分成三部分:1位,2位,3位。
对于1位而言,应写0-9?
对于2位而言,应写[1-2]0-9?
对于3位而言,应写30(\.0)?
在这里插入图片描述
这是正则表达式

在这里插入图片描述
测试结果与要求相符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值