正则表达式–必须爱他们

今天早上,我将定期进行的“与专家交谈”会议的时间移交给了费尔南多,费尔南多在进行聊天方面做得很出色,主题是正则表达式。 今天,我们的专家是SitePoint论坛的工作人员Thom Parkin和Allan H,他们在解释大多数程序员觉得很棘手的概念方面做得非常出色。

这是该会话中的资源列表:

什么是正则表达式?
如何创建正则表达式
语法和参数

而且,如果您喜欢拼图……您可能会或可能不会喜欢这些……

RegEx填字游戏
还有另一个填字游戏
还有一个

如果您因为不知道今天错过了会议,请确保在这里注册电子邮件提醒未来的会议

事不宜迟,这是会议记录:

[23:00] <nandotinoco>欢迎来到刚刚加入的人们。 汤姆·帕金(@ParkinT)是我们今天的专家。 他是SitePoint论坛的工作人员,在这里谈论正则表达式

[23:01] <ParkinT> AllanH还是Sitepoint论坛的工作人员,今天将成为专家。

[23:02] <ParkinT>这个话题对一个人来说太大了。

[23:03] <johnlacey>在没有正则表达式经验的情况下,您会在哪里推荐一个完整的初学者? 大声笑

[23:03] <AllanH>正则表达式有不同的“风味”。 我们想讨论Perl兼容的正则表达式

[23:03] <ParkinT>正则表达式在大多数编程语言中都是通用的。 但是,实现也因语言而异

[23:03] <ParkinT>我们希望将讨论保持在非常广泛和通用的水平上。

[23:04] <ParkinT>确实,艾伦。

[23:04] <AllanH> Apache mod重写,PHP,Javascript,当然Perl使用PCRE

[23:04] <ParkinT> RegEx的目的和意图是解析,匹配,查找和替换字符和字符串。

[23:04] <adams>为什么我必须在编程中学习正则表达式?

[23:05] <ParkinT>大问题。

[23:05] <ParkinT>实际上,您不需要学习RegEX

[23:05] <ParkinT>您不需要学习IF或Switch语句。

[23:05] <Jerry> GAWK RE与PCRE有多近?

[23:05] <ParkinT>这只是另一个可以(通常)为您提供帮助的工具。

[23:05] <AllanH>字符串功能不错,但有时功能不够强大

[23:05] <johnlacey>这实际上是关于模式识别的,不是吗? 我见过正则表达式来检查电子邮件地址是否符合预期格式,以及.htaccess重定向中的格式…

[23:06] <ParkinT>是的。

[23:06] <AllanH>并非总是那么容易

[23:06] <AllanH>我见过一些人得到了他们想要的东西并感到幸福

[23:07] <ParkinT>我不确定GAWK的实现与PCRE有多近。

[23:07] <AllanH>…直到他们也得到了自己不想得到的东西

[23:07] <杰里>如此,艾伦

[23:08] <johnlacey>那么您能给我们一个(简单的)正则表达式的例子吗?

[23:08] <ParkinT>关于所有软件代码,可以这么说吗?

[23:08] <Jerry>多数情况下,发现过多的问题要比什么都没有发现容易

[23:08] <ParkinT> JohnLacey提出了一个很好的问题…

[23:08] <AllanH>的确,我认为正则表达式既是科学又是艺术

[23:09] <ParkinT>电子邮件验证是RegEx的“经典”用例,但我认为这不是一个很好的例子。

[23:09] <AllanH>我从PHP文档开始

[23:09] <johnlacey>因为电子邮件地址可以符合规定的格式,但是仍然不存在?

[23:10] <AllanH>继续阅读并经常引用它

[23:10] <ParkinT>解析数据以确定例如小数点后的所有数字可能是“简单” RegEx的示例。 艾伦,你同意吗?

[23:10] <AllanH>是的,可能会出现一些问题

[23:11] <ParkinT>假设我有以下字符串:

[23:11] <ParkinT> 3.14159

[23:11] <ParkinT>正如johnlacey所提到的,使用RegEx查找模式。

[23:11] <ParkinT>艾伦,纠正我在任何陈述错误的地方……

[23:12] <ParkinT>小数点成为我们评估中的“锚点”。 我们想看看之后。

[23:12] <AllanH>,是否可以将其转换为浮点数?

[23:13] <ParkinT> DRAT。 我无法在此聊天中输入斜杠。

[23:13] <adams> / \

[23:13] <杰里> / foo /

[23:13] <ParkinT>是否存在我不知道的控制字符? 我想我刚刚关闭了纽约市的所有电源!!

[23:13] <AllanH>如果您知道总是有多少个数字,可以使用字符串功能

[23:14] <ParkinT>“ IF”,你知道。 对。

[23:14] <ParkinT>假设您没有

[23:14] <Jerry>在反斜杠前加反斜杠

[23:14] <ParkinT>谢谢。 这将使这个问题更加复杂!!!

[23:14] <AllanH>但是为了我们的缘故,我们需要获得小数!

[23:15] <ParkinT> /d*[.](d*)/

[23:15] <ParkinT> NO。 前面的斜杠也会出现。

[23:15] <ParkinT>这是我的处理方法。 斜线“ d”代表任何“数字”(数字)

[23:16] <ParkinT>我们知道小数点前有一个未知的数字。

[23:16] <ParkinT>斜线d后跟星号d *

[23:16] <AllanH>不是“。” 一个“通配符”?

[23:16] <ParkinT>接下来是小数本身。 但是,点是RegEx中的命令字符,因此我们需要将其定义为EXPLICIT

[23:17] <ParkinT>确切地说,艾伦

[23:17] <ParkinT>但是,如果将字符放在方括号中,它们将被视为文字

[23:17] <ParkinT>所以[。]代表点

[23:17] <AllanH>,只有一个点

[23:18] <ParkinT>接下来是我们试图捕获的数据。 因此,我们必须用大括号()括起来代表一个组。

[23:18] <ParkinT>,并且该数据还将是一组长度未知(d *)的数字

[23:19] <ParkinT>但假设我们甚至不确定小数点前是否有任何数字?

[23:19] <AllanH>“星号”表示零或更多

[23:19] <ParkinT>在这种情况下,此d * [。](d *)不起作用

[23:19] <ParkinT>您是正确的。 我把星星和问号弄混了。

[23:20] <ParkinT>表示一个或多个。 不好的例子。 我应该使用过吗? 然后解释星星。 *尴尬。

[23:20] <ParkinT>为了更好地回答原始问题,以下是正则表达式的一些“基本要素”。

[23:21] <ParkinT>正如艾伦(AllanH)指出的那样,星号表示零或更大,并指代它之前的集合。

[23:21] <AllanH>我喜欢Mozilla Docs for Javascript参考

[23:21] <ParkinT>您有链接吗?

[23:22] <AllanH> https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions

[23:22] <ParkinT>太好了! 我们现在可以回家了!

[23:22] <AllanH> https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp

[23:22] <AllanH>也许不是,文档不是最容易消化的东西

[23:23] <AllanH>例如 http://www.pcre.org/pcre.txt

[23:23] <ParkinT> RegEx对大多数人来说很难,因为它可能非常令人生畏。

[23:24] <johnlacey>我知道我一天只喝第二杯咖啡,只是阅读Mozilla文档,我的大脑就开始爆炸了。 大声笑

[23:24] <ParkinT>就像任何东西一样,如果您轻轻地接近它(一次咬一口)并小剂量练习……

[23:24] <ParkinT>语法很奇怪,而且字符的选择使它的阅读非常混乱。

[23:24] <AllanH>我只有并且仍然在“需要知道”的基础上学习。

[23:25] <johnlacey>常规的表达是否在语言之间有所不同,还是很普遍?

[23:25] <ParkinT>有许多评估RegEx的工具(在线和桌面)。 他们让您“尝试”不同的模式

[23:25] <ParkinT>正如我之前所说的,“正则表达式在大多数编程语言中都是通用的。 但是,不同语言的实现方式也不同”

[23:26] <ParkinT>有一些通用的语法规则,这些规则在不同的语言中不会有所不同。

[23:26] <AllanH>我认为一旦您掌握了基本语法,它们就差不多了,至少足以使您可以通过参考文档来弄清楚该怎么做

[23:26] 例如,<ParkinT> Ruby在几乎可以使用任何字符串的任何地方都可以识别RegEx。

[23:27] <AllanH>,如果不是二进制文件,则为文本

[23:29] <AllanH>我认为很多“

[23:30] <AllanH>我认为很多“工具”例如。 匹配,替换,拆分-跨语言也相似

[23:30] <nandotinoco>当修复.htaccess文件中的错误或试图找出URL重定向时,许多Web开发人员首先接触到RegEx。 您有针对这些情况的提示或技巧吗?

[23:30] <ParkinT>绝对!

[23:31] <ParkinT>我对这个问题的第一个回答nandotinoco是“ StackOverflow”!

[23:31] <ParkinT>嘲讽

[23:31] <AllanH>您可以尝试在http://www.sitepoint.com/forums/forumdisplay.php?97-Server-Configuration-Apache-amp-URL-Rewriting论坛中提问

[23:32] <nandotinoco>那更好;-)

[23:32] <ParkinT>这些改写似乎是他们自己的野兽。

[23:32] <johnlacey>我看过一些示例,其中他们检查domain.com/directory并将其更改为domain.com/directory/

[23:32] <AllanH> Apache具有“标志”之类的功能,有时可能会变得棘手,但语法相似

[23:33] <AllanH>是的,一定喜欢“友好的网址”

[23:33] <ParkinT>是的。 通过捕获组,然后重新应用捕获的内容,您可以完全重新布置事物

[23:34] <AllanH>,并且能够将HTTP请求从旧页面重定向到新页面

[23:35] <ParkinT>如果您想提高RegEx技能,可以使用正则表达式在线找到许多拼图和填字游戏。

[23:36] <johnlacey>您能让我们喜欢那些难题之一吗? 听起来很有趣(但也是挑战)。

[23:36] <johnlacey>链接我们*

[23:37] <ParkinT>正在搜索…

[23:37] <AllanH>您认为使用[a-zA-Z]之间有多少性能差异? [az] / i和[w]?

[23:38] <AllanH>我的感觉是,从一开始就使用最容易阅读的内容,然后随着您的进步而更加优雅地工作

[23:38] <ParkinT>这是一个很难回答的问题,可能因语言而异,并且-我敢打赌-会很轻微。

[23:39] <ParkinT>这是我承认我无法完成的一项: http : //www.coinheist.com/rubik/a_regular_crossword/grid.pdf

[23:39] <johnlacey>谢谢ParkinT

[23:39] <ParkinT>但是,对于开始来说更好,我刚刚在Google搜索中找到了这个网址: http ://regexcrossword.com/

[23:40] <AllanH>一行长30个字符但可读的行与8字符长但需要在头脑中进行“翻译”的效果相同

[23:40] <ParkinT>而且,这个看起来很有趣…… http://www.regexcrosswords.com/

[23:40] <ParkinT>我同意,AllanH。

[23:41] <ParkinT>开发人员倾向于过于偏爱“优雅”和“聪明”。

[23:41] <ParkinT>我被控有罪。

[23:41] <ParkinT>简洁是一件值得努力的事情。 但是可读性很重要,因为维护代码非常关键(而且非常昂贵)。

[23:41] <AllanH>,正如您所说,在性能方面,差异可忽略不计

[23:42] <AllanH>,但我们确实想炫耀;)

[23:42] <ParkinT>如果另一个开发人员(甚至您的未来)很难理解表达式的意图。

[23:42] <ParkinT>可以转化为金钱。

[23:42] <ParkinT>大声笑。

[23:42] <johnlacey>我完全同意–可读性是如此重要。

[23:43] <AllanH>大声笑添加比详细代码更长的注释

[23:43] <ParkinT>也许我们应该在线上学习那些难题(双关语意味深长),并开设有关可学习知识的正则表达式课程。

[23:44] <grrowl> irt w与[az]相比,实际上w较慢,因为它比AZ更能匹配很多,包括许多其他语言的“单词”字符

[23:44] <AllanH> @ParkinT一个为MC?

[23:46] <AllanH>确实,Perl的“单词”并不总是英文单词

[23:47] <AllanH>例如 my_function

[23:47] <ParkinT>同时,“朋友之间的时间是几毫秒?”

[23:48] <grrowl>是的,性能差异很小……除非您专门优化这种情况,否则请始终使用可读性最强的代码

[23:49] <AllanH>因此,我想知道我认为什么是首先“获得”基本的基本要求。 逃脱字符浮现在脑海;)

[23:50] <AllanH>和^ start和$ end

[23:50] <ParkinT>根据我的经验,“基础”是您最常使用的那些东西。

[23:50] <ParkinT>是的。 开始和结束。 数量 ? * + {。}

[23:50] <ParkinT>和(我称之为)快捷方式:w W s S

[23:51] <ParkinT> d

[23:51] <ParkinT>和NOT ^

[23:51] <AllanH>我一直都使用量词

[23:51] <AllanH>和字符类

[23:51] <ParkinT>这很重要,因为MOST RegEx实现非常贪婪

[23:52] <ParkinT>没有量词,您可以匹配的范围远远超出您的预期。

[23:53] <AllanH>是的,我有多少次看到一个线程,其中OP想要一个标签,但第一个标签获取了最后一个标签

[23:53] <ParkinT>要跟进先前的评论,我发现这非常有启发性: http ://regexcrossword.com/challenges/tutorial/puzzles/1

[23:54] <ParkinT>单击顶部导航区域中的帮助。

[23:56] <ParkinT>正则表达式的历史非常有趣。 它始于今天我们所知道的任何形式的计算机。

[23:57] <ParkinT>根据Wikipedia( http://en.wikipedia.org/wiki/Regular_expression)的说法,在1950年左右。 而且*我*已经很老了!

[23:58] <ParkinT>感谢大家抽出宝贵的时间参与。

[23:58] <ParkinT> Sitepoint和Learnables代表了现代Web开发人员难以置信的丰富资源。

[23:59] <nandotinoco>是的,除非有人想问最后一个问题,否则我们应该在这里进行讨论。

[23:59] <ParkinT>如果您对某些事情充满热情或谈论起来很自在,请告诉我们。

[23:59] <ParkinT>“专家”通常只是一个愿意大声谈论它的人。

[23:59] <nandotinoco>非常感谢您的宝贵时间AllanH和ParkinT,并感谢您分享一些知识

[0:00] <AllanH>我想补充一点,也可以在其他论坛中询问正则表达式问题

[0:00] <ParkinT> Sitepoint论坛!

[0:00] <AllanH> http://www.sitepoint.com/forums/forumdisplay.php?34-PHP

[0:00] <AllanH> http://www.sitepoint.com/forums/forumdisplay.php?15-JavaScript-amp-jQuery

[0:00] <AllanH> http://www.sitepoint.com/forums/forumdisplay.php?36-Perl-amp-Python

[0:01] <nandotinoco>当然。 论坛总是在那里,是一个很好的资源。 感谢其他人加入我们。 下周我们在谈论SASS

[0:01] <ParkinT>下周我们得到SASSY

[0:02] <AllanH>您最欢迎nandotinoco,谢谢大家

From: https://www.sitepoint.com/regular-expressions-gotta-love-em/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值