今天早上,我将定期进行的“与专家交谈”会议的时间移交给了费尔南多,费尔南多在进行聊天方面做得很出色,主题是正则表达式。 今天,我们的专家是SitePoint论坛的工作人员Thom Parkin和Allan H,他们在解释大多数程序员觉得很棘手的概念方面做得非常出色。
这是该会话中的资源列表:
而且,如果您喜欢拼图……您可能会或可能不会喜欢这些……
如果您因为不知道今天错过了会议,请确保在这里注册电子邮件提醒未来的会议 。
事不宜迟,这是会议记录:
[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/