regex - 正则表达式错误

标签 regex

我需要为用户名编写一个正则表达式(实际上是在比赛中)

  1. 用户名可以包含字母数字字符和/或下划线 (_)。

  2. 用户名必须以字母字符开头。

  3. 8 ≤ |用户名| ≤ 30。

现在我写的正则表达式是

字符串模式 = "(^[a-zA-Z][a-zA-Z0-9_]{8,30}$)";

在某些测试用例中显示错误,问题的正确解决方案是

字符串模式 = "(^[a-zA-Z][a-zA-Z0-9_]{7,29}$)";

现在我不明白为什么使用 {7,29} 而不是 {8,30},因为用户名必须在 8 到 30 个字符之间?

另一个问题为什么有必要在表达式的开头给出 ^ 并在最后给出 $ ?(我知道它们充当边界,但无法理解如何?所以如果有人可以解释的话)

最佳答案

这是您正确的正则表达式:

^[a-zA-Z][a-zA-Z0-9_]{7,29}$

{7,29}量词指的是匹配[a-zA-Z0-9_]的字符。因此,这意味着必须存在 7 到 29 个(含)之间的 this 字符。此外,第一个字符必须匹配[a-zA-Z]。将此添加到范围中会得到 8 到 30 个字符(含)。

对于你的第二个问题,^$符号是边界标记,标记开始(^)和结束( $) 的比赛。如果您没有使用这些标记,那么您的正则表达式也会匹配长度超过 30 个字符的单词,只要该单词的子字符串包含您的正则表达式匹配的模式。

这是一个演示正则表达式,它显示如果我们删除边界标记,长度超过 30 个字符的字符串将与您的模式匹配:

Regex101

尝试再次添加边界标记(^$),您会发现它会失败。

关于regex - 正则表达式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36146129/

相关文章:

来自负数的数字范围的正则表达式?

python - 使用 Python 替代品确定链接协议(protocol)

java - 从 Java/SQL 文件中提取 SQL 语句

regex - youtube-dl缓存以加快下载速度

c# - 将字符串与带有 IgnoreCase 的 Regex 或字符串的 ToLower 方法进行比较是否更快?

Java拆分正则表达式模式字母和数字

python - 使用 python 正则表达式查找图像路径

java - 正则表达式用于在没有被单引号或双引号包围时使用空格分割字符串

ruby-on-rails - 从 html 代码获取 youtube 视频 ID

javascript - 正则表达式从 Windows 的文件名中删除特殊字符