热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

是否有一个正则表达式来生成某种编程语言的所有整数

如何解决《是否有一个正则表达式来生成某种编程语言的所有整数》经验,为你挑选了1个好方法。

假设我正在构建一个编译器,我希望词法分析器识别C语言的整数,我可以指定例如整数应该在-2,147,483,648和2,147,483,647之间,长整数可以是64位吗?我觉得我的问题很愚蠢,但我想知道它是否可行......谢谢



1> zmo..:

简短的回答

是的,可以做到,但你不应该这样做!

剧透警报:你应该更好地使用strtol,我告诉你为什么在长的答案.

答案很长

可以用一个古怪制作的正则表达式(最差的一个是与MIN和MAX之间的所有整数列表中选择一个正则表达式)来完成,但是你希望做这样的事情.

这是因为这样的任务意味着对正则表达式进行大量处理,而该测试可以用您喜欢的语言进行很少的处理(将以下内容视为伪代码):

if (str_to_int(s) > CMIN && str_to_int(s) 

好吧,实际上你可能会告诉我" 但如果它是一个int,它会溢出! ".但有技术可以检测到:

如何检测整数溢出?

他们都没有使用正则表达式!

但无论如何,你不需要遇到这么多麻烦,当C标准库中已经有一个功能为你完成这项工作时:strtol功能!引用手册:

strtol()函数返回转换结果,除非该值会下溢或溢出.如果发生下溢,strtol()将返回LONG_MIN.如果发生溢出,strtol()将返回LONG_MAX.在这两种情况下,errno都设置为ERANGE.对于strtoll()(LLONG_MIN和LLONG_MAX而不是LONG_MIN和LONG_MAX)也是如此.

它为什么会很大?这是因为正则表达式是一个查看字符流的自动机.当有匹配时,你沿着自动机移动.基本上,你需要:

匹配任何10个字符的字符串,或者仅当它以a开头时为11 -

只包含数字,

如果它以a开头2,则只能跟着0或者1,

如果它有一个开始2,随后1,只能跟着0,1,2,3或者4

如果它有一个开始2,随后1再一个4,只能跟着一个1,2,3,4...7

...

如果它以a开头2,后面跟着...并以a结束7,但是如果它以a开头-,然后是a 2,则需要以a结束6(所以基本上你必须将所有先前的条件复制到另一个以该结尾的子图中)

对于任何其他角色来说,这是一场比赛.

这看起来有点像下面这样:

^(
  (
   \d|\d\d|\d\d\d|\d\d\d\d|\d\d\d\d\d|\d\d\d\d\d\d|
   \d\d\d\d\d\d\d|\d\d\d\d\d\d\d\d|\d\d\d\d\d\d\d\d\d|
   [0-2][0-1][0-4][0-7][0-4][0-8][0-3][0-6][0-4][0-8]
  )|
  -(
    \d|\d\d|\d\d\d|\d\d\d\d|\d\d\d\d\d|\d\d\d\d\d\d|
    \d\d\d\d\d\d\d|\d\d\d\d\d\d\d\d|\d\d\d\d\d\d\d\d\d|
    [0-2][0-1][0-4][0-7][0-4][0-8][0-3][0-6][0-4][0-7]
   )
 )$

由以下自动机直观表示(点击要播放的图像):

正则表达式可视化

我不确定会有多正确,因为我可能错过了边缘情况,但我希望我明确表示它与你喜欢的语言相比如何.如果你实际解析这么大的自动机,它会:

刻录CPU时间,

燃烧电力,

燃烧(燃料|煤| gaz |铀),

污染地球,

杀了一个小海豹

所有这些都不是做一些可以在使用正则表达式做同样事情的复杂性的1/100的操作中完成的事情.

可爱的小海豹

因此,如果您因为编程错误而不想杀死一个小海豹,请不要使用正则表达式来处理它未设计的内容.


资源

为了更好地理解什么是自动机,regexps如何工作,什么时候使用它是个好主意,当它是一个小密封杀死它时,我只能建议你看看以下课程:

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-045j-automata-computability-and-complexity-spring-2011/lecture-notes/MIT6_045JS11_lec04.pdf

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-005-elements-of-software-construction-fall-2011/lecture-notes/MIT6_005F11_lec05.pdf

http://www.saylor.org/site/wp-content/uploads/2012/01/CS304-2.1-MIT.pdf

关于这个主题的另一个答案:如何在python中找到所有可能的正则表达式匹配?

关于边缘情况的好答案strtol:如果LONG_MAX是2147483647,strtol(" - 2147483648",0,0)是否会溢出?


这是@ Andie2302答案的可视化:

-\b(?:
     214748364[0-8]|21474836[0-3][0-9]|2147483[0-5][0-9]{2}|
     214748[0-2][0-9]{3}|21474[0-7][0-9]{4}|2147[0-3][0-9]{5}|
     214[0-6][0-9]{6}|21[0-3][0-9]{7}|20[0-9]{8}|1[0-9]{9}|
     [1-9][0-9]{1,8}|[0-9]|-0
 )\b|
 \b(?:
     214748364[0-7]|21474836[0-3][0-9]|2147483[0-5][0-9]{2}|
     214748[0-2][0-9]{3}|21474[0-7][0-9]{4}|2147[0-3][0-9]{5}|
     214[0-6][0-9]{6}|21[0-3][0-9]{7}|20[0-9]{8}|1[0-9]{9}|
     [1-9][0-9]{1,8}|[0-9]|-0
 )\b

通过其匹配的自动机:

正则表达式可视化,点击我和我一起玩吧!

还是不相信?

HTH


推荐阅读
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了2020年计算机二级MSOffice的选择习题及答案,详细解析了操作系统的五大功能模块,包括处理器管理、作业管理、存储器管理、设备管理和文件管理。同时,还解答了算法的有穷性的含义。 ... [详细]
  • 关于CMS收集器的知识介绍和优缺点分析
    本文介绍了CMS收集器的概念、运行过程和优缺点,并解释了垃圾回收器的作用和实践。CMS收集器是一种基于标记-清除算法的垃圾回收器,适用于互联网站和B/S系统等对响应速度和停顿时间有较高要求的应用。同时,还提供了其他垃圾回收器的参考资料。 ... [详细]
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 正则表达式及其范例
    为什么80%的码农都做不了架构师?一、前言部分控制台输入的字符串,编译成java字符串之后才送进内存,比如控制台打\, ... [详细]
  • 电脑f5键是什么作用
    常见问题f5常见问题韩亚整形医院源码,vscode写前端代码,ubuntu低配,tomcat下载路径乱码,爬虫_gscu,php精粹pdf,广州快速seo优化排名,aspwap网站 ... [详细]
  • LaTeX使用XeLaTeX入门基础(一)
    主机平台:GentooLinux11.2内核版本:LinuxKernel3.2.1编译环境:XeTeX3.1415926-2.3-0. ... [详细]
  • 校园表白墙微信小程序,校园小情书、告白墙、论坛,大学表白墙搭建教程
    小程序的名字必须和你微信注册的名称一模一样在后台注册好小程序。mp.wx-union.cn后台域名https。mp.wx-union.cn ... [详细]
  • Linux 程序设计学习笔记----动手编写makefile文件
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 关于extjs开发实战pdf的信息
    本文目录一览:1、extjs实用开发指南2、本 ... [详细]
author-avatar
seaknkoo_776
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有