正则表达式的前世今生

news2025/6/5 14:57:20


当你熟练地用正则表达式查找替换代码时,这个工具的历史可以追溯到1943年。那时候还没有计算机,更别说编程语言了。

从神经网络到文本匹配

故事要从两个神经生理学家说起。1943年,Warren McCulloch和Walter Pitts发表了一篇论文《A logical calculus of the ideas immanent in nervous activity》。这篇论文不仅是正则表达式的起点,同时也提出了第一个神经网络的数学模型。

很有意思,对吧?今天我们用来处理文本的正则表达式,竟然和人工智能有着共同的起源。这或许说明了一个道理:很多看似不相关的技术,在底层往往有着相似的数学基础。

真正给正则表达式命名的是数学家Stephen Kleene。1956年,他在论文《Representation of events in nerve nets and finite automata》中首次提出了"regular sets"和"regular expressions"这两个术语。数学家就是数学家,总能把复杂的概念用精确的语言表达出来。

Unix之父的贡献

12年后,一个传奇人物登场了。1968年,Ken Thompson发表了《Regular Expression Search Algorithm》。这个名字你可能不熟悉,但他的作品你肯定知道:Unix操作系统、B编程语言、UTF-8编码。可以说,没有Ken Thompson,就没有今天的计算机世界。

Ken Thompson不满足于只写论文,他把正则表达式集成到了自己的QED编辑器里。当时要用正则表达式搜索,需要这样写:

g/<regular expression>/p

这里g表示global search(全局搜索),p表示print(打印)。如果把"regular expression"缩写成"re",就变成了g/re/p。没错,这就是Unix命令行工具grep的由来。

每次用grep命令的时候,你实际上都在致敬这段历史。工具的命名往往蕴含着深刻的设计思想,grep这个看似随意的名字,其实承载着几代程序员的智慧结晶。

Perl推动的普及

后来的发展有两个关键节点。首先是Henry Spence发布了第一个非专有的regex库,让更多人能够使用这个工具。然后是Larry Wall创造了Perl语言,真正把正则表达式推向了主流。

Perl的实现往前走了一大步,在原有语法基础上增加了很多修改,形成了所谓的"Perl flavor"。后来大多数编程语言的正则表达式实现都基于Perl风格。这说明了一个道理:技术的传播往往不是最初的版本获胜,而是最实用、最易用的版本胜出。

Python的选择

今天,Python的标准模块re只支持Perl风格的正则表达式。这里有个有趣的现象。很多程序员对正则表达式又爱又恨。它功能强大,但学习曲线陡峭,写出来的表达式往往难以阅读。于是就有了这样一句名言:

"Some people, when confronted with a problem, think 'I know, I'll use regular expressions.' Now they have two problems."
—Jamie Zawinski, 1997

这句话道出了一个深刻的问题:工具的复杂性和实用性之间的平衡。正则表达式虽然强大,但如果不注意写法,很容易变成维护的噩梦。

无处不在的存在

今天,正则表达式真的是无处不在。从最新的JavaScript框架到70年代的Unix工具,从办公软件到现代编程语言,你很难找到一个不支持正则表达式的地方。可以说,一个编程语言如果不支持正则表达式,就不能称为完整的现代语言。

但是,尽管正则表达式在各种语言和框架中都很常见,它们在现代程序员的工具箱中还不够普及。原因就是那个陡峭的学习曲线。很多人觉得正则表达式太复杂,读起来像天书一样。

这其实说明了一个道理:技术的广泛应用和深度掌握是两回事。很多强大的工具都有这个特点,表面上看起来很普及,但真正能熟练运用的人并不多。

回顾正则表达式的发展历程,我们可以看到几个有趣的模式:

首先,真正有影响力的技术往往起源于基础研究,然后在工程实践中发扬光大。从神经网络研究到文本处理工具,这个跨越说明了基础科学研究的重要性。

其次,好的工具往往是在使用过程中不断演化的。从QED到grep,从Kleene的数学定义到Perl的实用扩展,每一步都是在解决实际问题的过程中自然发生的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2397238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 核心技术与实战智慧商城项目Day08-10

温馨提示&#xff1a;这个黑马的视频在b占可以找到&#xff0c;里面有完整的教学过程 然后这个项目有完整的代码&#xff0c;我已经上传了&#xff0c;如果审核成功大家就可以看了&#xff0c;但是需要审核多久我也不是很确定 1.项目演示 2. 项目收获 3. 创建项目 4. 调整初始化…

TCP/IP协议精华总结pdf分享

hi &#xff0c;大家好&#xff0c;应小伙伴们的要求&#xff0c;上次分享了个人的一些学习和职场经验&#xff0c;其中网络协议PDF文档是我之前学习协议的时候总结一些精华知识&#xff0c;网络属于基本功&#xff0c;是互联网必备知识&#xff0c;我深信掌握好核心20%知识&am…

⚡️ Linux grep 命令参数详解

⚡️ Linux grep 用法及参数详解 &#x1f4d8; 1. grep 简介 grep 是 Linux/Unix 系统中用于文本搜索的命令&#xff0c;其全称为 Global Regular Expression Print&#xff0c;意为全局正则表达式打印器。 它根据给定的 模式&#xff08;pattern&#xff09; 对文件或标准…

2025年第三届CCF·夜莺开源创新论坛通知

点击蓝字 关注我们 CCF Opensource Development Committee 01 大会简介 由中国计算机学会主办、CCF开源发展委员会及夜莺开源社区承办的第三届CCF夜莺开源创新论坛拟于2025年7月4日在北京召开。本次论坛以“AI 加速可观测”为主题&#xff0c;汇聚了开源夜莺核心开发团队&#…

GMDCMonitor企业版功能分享0602

企业版包含了拓扑中心、签退中心、知识库、通知渠道配置、平台自定义&#xff0c;这5个功能 1&#xff09;拓扑中心 拓扑中心绘制的时候需要注意2点&#xff1a; 1&#xff09;要先选择 “矩形区域” 或 “圆形区域” 来添加各个背景区域&#xff0c;同时录入区域尺寸&#x…

Warm-Flow发布1.7.3 端午节(设计器流和流程图大升级)

Warm-Flow发布1.7.3 端午节&#xff08;设计器流和流程图大升级&#xff09; 更新内容项目介绍功能思维导图演示地址官网Warm-Flow视频 更新内容 [feat] 新版流程图通过前端渲染[perf] 美化流程设计器ui[feat] 办理人权限处理器&#xff0c;新增办理人转换接口&#xff0c;比如…

【存储基础】SAN存储基础知识

文章目录 1. 什么是SAN存储&#xff1f;2. SAN存储组网架构3. SAN存储的主要协议SCSI光纤通道&#xff08;FC&#xff09;协议iSCSIFCoENVMe-oFIB 4. SAN存储的关键技术Thin Provision&#xff1a;LUN空间按需分配Tier&#xff1a;分级存储Cache&#xff1a;缓存机制QoS&#x…

2025年ESWA SCI1区TOP,改进成吉思汗鲨鱼算法MGKSO+肝癌疾病预测,深度解析+性能实测

1.摘要 本文针对肝癌&#xff08;HCC&#xff09;早期诊断难题&#xff0c;提出了一种基于改进成吉思汗鲨鱼优化算法&#xff08;MGKSO&#xff09;的计算机辅助诊断系统。由于HCC在早期症状不明显且涉及高维复杂数据&#xff0c;传统机器学习方法易受噪声和冗余特征干扰。为提…

Spark-TTS: AI语音合成的“变声大师“

嘿&#xff0c;各位AI爱好者&#xff01;还记得那些机器人般毫无感情的合成语音吗&#xff1f;或者那些只能完全模仿但无法创造的语音克隆&#xff1f;今天我要介绍的Spark-TTS模型&#xff0c;可能会让这些问题成为历史。想象一下&#xff0c;你可以让AI不仅说出任何文字&…

WEB3——简易NFT铸造平台之nft.storage

该平台目前已经不太支持免费试用&#xff0c;现在推荐Pinata平台&#xff0c;免费用1GB Pinata | Cryptos file storage 下面web3.storage也可以用&#xff0c;但是需要你有可以交易的外币卡 w3up console &#x1f9e0; 1. nft.storage 是什么&#xff1f; https://nft.stor…

一元函数积分

1. 不同名函数积分 2.三角函数有理式

6年“豹变”,vivo S30系列引领手机进入场景“体验定义”时代

出品 | 何玺 排版 | 叶媛 5月29日晚&#xff0c;备受用户期待的vivo S30系列如约而至。 相比前几代S系列产品&#xff0c;S30系列变化显著&#xff0c;堪称“豹变”。首先&#xff0c;其产品打造思路发生了质变&#xff0c;产品体验更好&#xff0c;综合竞争力更为强。其次&a…

linux驱动开发(1)-内核模块

内核模块 模块最大的好处是可以动态扩展应用程序的功能而无须重新编译链接生成新的应用程序镜像&#xff0c;在微软的Windows系统上动态链接库DLL&#xff08;Dynamic Link Library&#xff09;&#xff0c;Linux系统上的共享库so&#xff08;shared object&#xff09;文件的…

AI产品风向标:从「工具属性」到「认知引擎」的架构跃迁​

近年来&#xff0c;人工智能正在改变法律行业的游戏规则。从最初的“工具属性”——帮律师干些重复的杂活儿&#xff0c;到如今逐渐变身为“认知引擎”——能够理解法律逻辑、分析案例&#xff0c;法律AI产品正在迎来一场华丽的转身。这篇文章将带你一探究竟&#xff0c;看看这…

前端八股之CSS

CSS 盒子模型深度解析与实战 一、盒子模型核心概念 Box-sizing CSS 中的 box-sizing 属性定义了引擎应该如何计算一个元素的总宽度和总高度 语法&#xff1a; box-sizing: content-box|border-box|inherit:content-box 默认值&#xff0c;元素的 width/height 不包含paddi…

微服务-Sentinel

目录 背景 Sentinel使用 Sentinel控制台 Sentinel控制规则 Sentinel整合OpenFeign 背景 在微服务项目架构中&#xff0c;存在多个服务相互调用场景&#xff0c;在某些情况下某个微服务不可用时&#xff0c;上游调用者若一直等待&#xff0c;会产生资源的消耗&#xff0c;极端情…

MySQL垂直分库(基于MyCat)

参考资料&#xff1a; 参考视频 参考博客 Mycat基本部署 视频参考资料&#xff1a;链接: https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg 提取码: aag3 概要&#xff1a; 本文的垂直分库&#xff0c;全部是基于前文部署的基本架构进行的 垂直分库&#xff1a; 垂直分库…

Rust 变量与可变性

文章目录 变量与可变性常量遮蔽&#xff08;Shadowing&#xff09; 变量与可变性 Rust中变量默认是不可变的&#xff0c;这是 Rust 鼓励你编写更安全、易于并发代码的众多方式之一。不过&#xff0c;你仍然可以选择让变量可变。让我们来探讨 Rust 为什么鼓励你优先使用不可变性…

深入理解 C++ 中的 list 容器:从基础使用到模拟实现

一、list 的底层数据结构与核心特性 1.1 双向循环链表的物理结构 节点定义&#xff1a;每个节点包含三个部分 template <typename T> struct ListNode {T data; // 存储的数据ListNode* prev; // 指向前驱节点的指针ListNode* next; // 指向后继节点的指针L…

状态机实现文件单词统计

系统如何查找可执行文件 默认&#xff1a;在PATH路径下寻找文件文件下 执行当前目录下文件&#xff1a; ./&#xff1a;指定文件目录是当前目录 ./count:执行当前目录文件 编译.c文件为运行文件 gcc -o count 0voice.c #将0voice.c编译为名字count 为什么主函数要那么写&a…