需要一个包含至少一个数字、零个或多个字母、没有空格、最小/最大的正则表达式
Posted
技术标签:
【中文标题】需要一个包含至少一个数字、零个或多个字母、没有空格、最小/最大的正则表达式【英文标题】:Need a Regex that contains at least one number, zero or more letters, no spaces, min/max 【发布时间】:2016-05-06 06:00:36 【问题描述】:我需要一个正则表达式来匹配包含以下内容的字符串:
至少一个数字 零个或多个字母 没有其他字符,如空格字符串也必须最少 8 个字符,最多 13 个字符。
数字和/或字母在 8-13 个字符串中的位置无关紧要。我还没有弄清楚如何确保字符串包含一个数字,但这里有一些表达式不起作用,因为它们在在线工具 Regexr 中提取空格。往下看:
- ([\w^/s])8,13
- ([a-zA-Z0-9])8,13
- ([a-zA-Z\d])8,13
我特别希望排除空格和特殊字符。链接和相关的问题似乎都允许这些字符。这不是用于验证密码,而是用于在自然语言处理中检测案例编号。这与“密码 REGEX 至少有 6 个字符,至少一个字母和一个数字,并且可能包含特殊字符”不同,因为我正在寻找至少一个数字但零个或多个字母。我也不想返回包含任何特殊字符(包括空格)的字符串。
【问题讨论】:
我特别希望排除空格和特殊字符。链接和相关的问题似乎都允许这些字符。这不是用于验证密码,而是用于在自然语言处理中检测案例编号。 在 SO 上回答了一千万个密码验证正则表达式问题,但这个问题是 Duplicate 吗?你一定是在开玩笑.. 使用这个^(?=.*\d)[a-zA-Z\d]8,13$
非常感谢@sln,成功了!!我没有看到任何支持您的答案的选项。
@sln:发表你的答案。
【参考方案1】:
这是符合您要求的典型密码验证。请注意,这也将匹配 8-13 位数字(但需要)。
1000 万 + 1 个(并且还在增加)满意的客户 ..
^(?=.*\d)[a-zA-Z\d]8,13$
解释
^ # Beginning of string
(?= .* \d ) # Lookahead for a digit
[a-zA-Z\d]8,13 # Consume 8 to 13 alphanum characters
$ # End of string
【讨论】:
谢谢。我的第一个问题是我正在拾取空间。答案看起来类似于我的第三次尝试,但我现在看到我在“消费 alpahnum”部分周围有括号,这可能导致了问题。 考虑到匹配文档中字符串的目的,使用单词边界(\b 或类似,可能是空格+点字符类)进行锚定可能比克拉/美元更有用。 :) @dannysauer -^$
是一个包罗万象的边界结构。它说:“由于人们对正则表达式的理解不足以解释复杂的边界概念,因此使用了基本的开始/结束锚点。”
您是否允许使用零宽度的前瞻断言并且仍然声称简单? ;)
@dannysauer - 实际上,任何在角色之间操作的构造都是一个复杂的实体。短语zero-width
是公牛**,因为构造的内容与其他任何内容都匹配,但在不同的框架上。【参考方案2】:
我在互联网上到处都看到了上面的答案(sln),但据我所知,它并不准确。
如果您的字符串包含 8 到 13 个没有数字的字符,则此表达式将匹配它,因为它在正向预测中使用通配符 .
上的 *
量词。
为了在至少 8 个字符长的密码中匹配至少 1 个数字、1 个 A-Z
和 1 个 a-z
,您需要这样的东西:
(?=.1,7\d)(?=.1,7[a-z])(?=.1,7[A-Z])[a-zA-Z\d]8,13
它使用 3 个前瞻:
(?=.1,7\d)
(?=.1,7[a-z])
(?=.1,7[A-Z])
每次,它都会查找目标(例如第一个数字),但允许在它之前出现 1 到 7 个字符。 然后它将匹配 8 到 13 个字母数字字符。
Powershell 用户注意事项: 使用搜索组能够提取结果
$password = [regex]::match($string-to-search,'(?=.1,7\d)(?=.1,7[a-z])(?=.1,7[A-Z])([a-zA-Z\d]8,13)').Groups[1].Value
【讨论】:
不需要 3 次前瞻。此外,您的正则表达式匹配不想要的%*!:;123abcABC-'"
,但不匹配想要的123456789
。 Demo。重新阅读问题。以上是关于需要一个包含至少一个数字、零个或多个字母、没有空格、最小/最大的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章
R REGEX匹配-至少1个小写字母,1个数字,并且没有8个长度的特殊字符[重复]