我需要为用户名编写一个正则表达式(实际上是在比赛中)
用户名可以包含字母数字字符和/或下划线 (_)。
用户名必须以字母字符开头。
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 个字符的字符串将与您的模式匹配:
尝试再次添加边界标记(^
和 $
),您会发现它会失败。
关于regex - 正则表达式错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36146129/