【发布时间】:2014-11-14 05:16:20
【问题描述】:
我正在寻找一个匹配至少 8 个字符、至少一个大写字符、至少一个小写字符和至少一个数字的字符串(即密码)的正则表达式。
一个有效的正则表达式(在here 的帮助下)是:
(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[0-9a-zA-Z]{8,}$)
此正则表达式使用正向前瞻 (?=)。这是一项昂贵的操作。是否可以在不使用积极前瞻的情况下制作这个正则表达式?
【问题讨论】:
-
这是一项昂贵的操作 你为什么这么说?您始终可以接受来自用户的
^[0-9a-zA-Z]{8,}$并使用代码进行验证。 -
反正使用正则表达式的范围很广。我不知道这是谁开始的。这项工作不适合正则表达式。使用代码对其进行测试而不是依赖正则表达式引擎并希望它做得最好,这样会更快、更准确。
-
@anubhava 一切都保存在缓冲区中的事实。有人通过Mastering Regular Expression Third Edition 书解释了这一点。当然,这在代码中更快,但这不是问题。是否可以使用没有前瞻的正则表达式来做到这一点?
-
我们不应该以这样的理由尝试解决问题。为什么创建一些微小的缓冲区会给您带来任何问题?你的内存不足了吗?即使使用正则表达式本身也会产生一些小成本,所以为什么还要使用正则表达式。
-
@Mariano 确实不正常。像这样广泛使用 pcre 几乎是作弊,因为它依赖的东西超出了对正则表达式的公认理解能力。但无论如何,不错的 hack。
标签: regex