正则表达式一

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

提示:这里可以添加本文要记录的大概内容:
特点:通用性,跨语言
主流语言都有正则表达式,而且表达式的规则都几乎相同的。


提示:以下是本篇文章正文内容,下面案例可供参考

一、源码展示分析

fprintf(fp, "    %-20.6f%-20.6f%-20lu%-30s%-70s\n",

第一部分:%作为格式符号,-20意思离左侧20格,f表示float浮点数,.6表示小数点后6位

%-20.6

第二部分同理

%-20.6

第三部分:%作为格式符号,-20意思离左侧20格,lu表示整数

%-20lu

第三部分:%作为格式符号,-30意思离左侧30格,s表示string

%-30s

第四部分同理

%-70s

二、虚拟项目代码展示分析

 ///[a-zA-Z0-9]*  ->    /a*/	零或多個 a
    if (isalpha(LastChar)) { // identifier: [a-zA-Z][a-zA-Z0-9]*  except number basically, staring from [a-zA-Z] following by [a-zA-Z0-9]

这里是我当时自己写的备注,说明就是我们可以看到两个部分[a-zA-Z]这个是针对首字母的匹配规则,说明(背景这里是在自研一个toy语言的一个编译阶段的词法解析器)这个token解析要求char的首字母是26英文字符表,不能是别的,而后面的部分可以使字母或数字,使用的是封装好的函数isalpha()

但是后面*的使用说明了必须是由多个,也就是说我们的token不允许单个首字母匹配Identifier token

        ///Number: [0-9.]+ ->  /a./含字母 “a” 以及其後任一個字元的字串,例如 “ab”, “bac” 不成立:“a”;         /a+/	一或多個 a
    if (isdigit(LastChar) || LastChar == '.') {   // Number: [0-9.]+    integer, decimal number come here

这里是针对数字token,isdigit()即为[0-9.]+ 这里的点表示没有 11连起来这种,这里用的是+表示一个或者多个,而不是针对【】里面的数,所以0-9就是0-9,如果你要11,就是连读两个char=‘1’,而不是直接匹配‘11’,你要12,就读一个char=‘1’再读一个char=‘2’,而不是直接匹配‘12’;

其次这里的解析漏洞:这里不能处理异常数据比如0.12.112.12这个不是一个数,但是解析会将这个错误的输入误认为Number token

总结

提示:这里对文章进行总结:
例如:后续继续对正则表达式进行整理积累。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值