大咖直播-鸿蒙原生开发与智能提效实战!>>> 了解详情
写点什么

新年里学些正则表达式吧!

  • 2013-01-22
  • 本文字数:1761 字

    阅读完需:约 6 分钟

新年里如果你正想学些什么,那么学习正则表达式是肯定不会错的。正则表达式在各主要平台上均可使用,学会这种技能会对你的生涯产生持续的红利。开始学习的一种途径是 Firas Dib 的正则表达式101

除了一般的试题外,RegEx 101 还提供了一个正则表达式的解释器。它将正则表达式划分为不同部分,并解释每个部分的工作原理。这样的功能不仅对初学者有用,更有助于那些想了解遗留代码中正则表达式作用的成熟开发人员。

InfoQ:请问你创建 regex101.com 的灵感来源于什么?

Firas Dib:多年前我就有个 IRC 的 Bot,它可以解析输入的正则表达式。不久前,在创建 regex101 前,我已经在所说的 Bot 上实现了自测的功能。一开始,这确实是个有意思的项目,但是随着时间的推移,事情越来越变得一发不可收拾,难以管理,这是因为项目使用 mIRC 的脚本语言编写。而且,这还不是唯一的限制。由于所有的通讯都是通过 IRC(仅限于文本)方式完成的,并不直观,很难吸引用户使用它。Bot 的解析部分受到了广泛的感激,但同样也令人讨厌,因为他会向 IRC 通道发出大量的信息。于是我开始思考,有没有更好的方式来提供这些服务,而没有我所面临的这些限制呢?当然是一个网站了!于是,我就开始将写的不怎么好的 mIRC 代码转换为写的还凑合的 PHP 代码。

InfoQ:请问你开发这个网站投入了多长时间?

Firas Dib:大概是去年夏天,我开始建设这个网站。

我也想提一下的是,我很清楚网站与 rubular 有很多设计相似性。这并不是我设计的初衷。但是呢,在设计过程中,整个设计与 rubular 越来越相似(因为这样一个布局很自然也很不错),最终,我直接借用了 rubular 网站上的快速参考和其它一些周边的东西。当然,我联系了他(rubular 的作者),解释了这个网站的情况,如果有什么问题,他可以给我发邮件,我会处理。上述内容我也添加到了网站的致谢里面。我提到这个是因为我不希望有人认为我做了抄袭或类似的事情;网站的所有代码都是我自己花了很多时间编写的(除了快速参考之外)。

InfoQ:有种说法说正则表达式是一种“只写”的语言。也就是说,多数程序员写出的正则表达式很难被理解。你对此有何看法?

Firas Dib:这种说法可能很正确,这也是我创建这个服务的部分原因。你看,人们加入 IRC 并通过 Bot 解析所提交的正则表达式,然后离开。也可能过会儿回来再做类似的事情。现在有了这个网站,他们可以把网页一直开着,或者为自己的正则表达式创建一个永久链接。不仅如此,他们还可以用这个网站测试用例并将自动解析的结果给同事参考,甚至还可以把这个结果作为代码的注释!从某种程度上,这样可以有效避免或者减少“只写”的正则表达式。

InfoQ:我不太熟悉你所说的 Bot。能详细说下吗?

Firas Dib:Bot 是我使用的一个 mIRC 客户端,运行在我朋友的服务器上。其实没什么惊艳的功能。我经常使用 mIRC 的原因不过是因为我十分熟悉 mIRC 的客户端,年轻时常常在 mIRC 里面编写脚本。

InfoQ:解释器的功能是如何编写的?

Firas Dib:解释器的特性实际上是使用了正则表达式来分解正则表达式(是不是好像盗梦空间?)。好吧,不全都是正则表达式,但是可以用正则表达式的地方我都用了。虽然听起来古怪,但因为 PCRE 库如此强大,并且支持递归,我可以通过它来精确解析输入的参数。为了实现这种方式,我不得不通读 PCRE 手册好多遍。相信我,这不是什么好玩的事情。即使如此,我的服务也不是完全兼容 PCRE 的。我略过了一些几乎没人使用的特性。

InfoQ:这个站点是使用 PHP 版本的正则表达式编写的。对于那些通过别的方式实现(.NET、Java 等)的用户,有没有你认为特别的地方需要提醒他们的?

Firas Dib:是的,站点是使用 PHP 编写的,使用的是(非常强大的)PCRE 库。PCRE 库支持了很多其他库所不支持的特性,比如递归、环视和条件语句。人们需要知道自己使用的语言在正则表达式中的限制。我倒是可以帮助用户解决简单的问题,如转义或类似的问题。比如,Java 需要你对反斜线进行转义:输出\w 时应当键入\w。目前已经有很多用户要求增加这个功能,我也肯定会考虑这个问题。

查看英文原文 Learn some RegEx for the New Year


感谢杨赛对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。

2013-01-22 04:063495
用户头像

发布了 36 篇内容, 共 15.2 次阅读, 收获喜欢 2 次。

关注

评论

发布
暂无评论
发现更多内容

ArrayList源码分析-迭代器

zarmnosaj

5月月更

记一次简单易上手的内网渗透实战

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

Java 8 开始新增的 Optional 类 - Optional 中的方法

HoneyMoose

零基础学Java第二节(运算符、输入、选择流程控制)

编程攻略

Java学习 5月月更

☕️从 Java8 到 Java17 的新特性(四):Java11 的新特性

看山

Java Java11 LTS

druid 源码阅读 7——keepAlive实现方式

张大彪

万字长文!一文搞懂InheritedWidget 局部刷新机制

岛上码农

flutter ios 前端 安卓 5月月更

二分查找树

工程师日月

二叉树 5月月更

加入MOVE,一起体验Move2Earn的运动乐趣

股市老人

linux之sudo使用技巧汇总

入门小站

Linux

在线文本列表交集计算工具

入门小站

工具

Java 8 开始新增的 Optional 类 - Optional 对象中的异常

HoneyMoose

☕️从 Java8 到 Java17 的新特性(九):Java16 的新特性

看山

Java java16

Java 8 开始新增的 Optional 类 - 检查 Optional 的值

HoneyMoose

四、容器安全风险分析

穿过生命散发芬芳

云原生安全 5月月更

☕️从 Java8 到 Java17 的新特性(八):Java15 的新特性

看山

Java java15

☕️从 Java8 到 Java17 的新特性(二):Java9 的新特性

看山

Java Java9

架构实战营-第一周

Asura

【愚公系列】2022年05月 二十三种设计模式(十六)-迭代器模式(Iterator Pattern)

愚公搬代码

5月月更

JavaWeb JDBC

Emperor_LawD

javaWeb JDBC 5月月更

在线TSV某一列提取下载

入门小站

工具

☕️从 Java8 到 Java17 的新特性(五):Java12 的新特性

看山

Java Java12

☕️从 Java8 到 Java17 的新特性(六):Java13 的新特性

看山

Java Java13

☕️从 Java8 到 Java17 的新特性(七):Java14 的新特性

看山

Java java14

贝叶斯简介

5月月更

【活动预告】云上数字工厂与中小企业数字化转型创新论坛

阿里云弹性计算

数字化转型 中小企业 云盒

【刷题第 11 天】26. 删除有序数组中的重复项

白日梦

5月月更

☕️从 Java8 到 Java17 的新特性(三):Java10 的新特性

看山

Java Java10

数据库连接池 -Druid 源码学习(七)

wjchenge

Druid 数据库连接池

☕️从 Java8 到 Java17 的新特性(十):Java17 的新特性

看山

Java java17

C++中字符三兄弟(WCHAR、CHAR、TCHAR)

liuzhen007

c c++ 5月月更

新年里学些正则表达式吧!_语言 & 开发_Jonathan Allen_InfoQ精选文章