为初学者阅读正则表达式

Posted

技术标签:

【中文标题】为初学者阅读正则表达式【英文标题】:reading regular expression for beginner 【发布时间】:2014-03-22 09:40:55 【问题描述】:

我已经阅读了不同网站上的基本正则表达式来研究它们。我的问题是我不明白其中的一些。这是我正在查看的一个示例,用于验证来自 w3schools 的电子邮件地址

$email = test_input($_POST["email"]);
if (!preg_match("/([\w\-]+\@[\w\-]+\.[\w\-]+)/",$email)) 
   $emailErr = "Invalid email format"; 

根据我自己的理解,我不理解 [\w\-]+ 部分,它说“至少有一个字母数字的字符串”。你能给我一个清楚的解释吗?

【问题讨论】:

使用正则表达式.info,他们是正则表达式教程的好站点。您也可以在gskinner.com/RegExr 中输入您的正则表达式,然后将鼠标悬停在每个部分上,它会在工具提示中进行解释。 regular-expressions.info 有一个很好的(免费)教程,是一个很好的起点。 仅供参考 - 该模式将使有效的电子邮件地址无效,例如 me+***@example.comme@example。它还将传递无效地址,例如hey look@this.thing over here regex101.com 帮助我了解正在发生的事情。 【参考方案1】:

character class[\w\-](或更准确地说,没有不必要的转义,[\w-])表示

    \w - Word character;任何字母、数字或下划线字符,或... - 任何连字符

使用[\w-]+ 表示“一个或多个字母、数字、下划线或连字符”

如上面的 cmets 所述,不要使用 W3Schools。 http://www.regular-expressions.info/ 是可用的最佳资源(恕我直言)。

【讨论】:

【参考方案2】:

解释:

[\w\-]+

这意味着任何单词字符(a-z 和下划线)和连字符\-,在一次和无限次之间,根据需要返回(贪婪)+

一些很好的正则表达式学习资源:

http://Regex101.com

http://www.regular-expressions.info

开始吧。

【讨论】:

【参考方案3】:

这是细分:

    \w 是一个字符类,仅表示字母、数字和下划线。在正则表达式中,这是 [A-Za-z0-9_] 的缩写 \w\- 将连字符添加到 \w 类(不知道为什么连字符被转义) [\w\-]+ 表示至少重复该模式一次。所以,9@email.com 是有效的,但@email.com 显然不是。

另外,根据您的用例,您可能会对 SO 上关于为什么依赖正则表达式来验证电子邮件地址可能是一个坏主意的讨论感兴趣:

Using a regular expression to validate an email address

【讨论】:

连字符可能被转义了,因为大多数新手(比如 W3Schools 的作者/编辑)认为字符类中的连字符总是定义了一个范围 知道了。对于 OP,尽可能避免使用 w3schools。

以上是关于为初学者阅读正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式

给初学者的 Python 建议。正则表达式,字典等?

ES2018正则表达式更新

python初学者日记02(正则表达式)

初学者爬虫运行基础:正则表达式

如何用 Python 和正则表达式抽取文本结构化信息?