正则表达式出错



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

  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(包括7到29)个这样的特征。此外,还有第一个字符必须与[a-zA-Z]匹配。将其添加到范围中可得到8到30个字符(包括在内)。

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

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

Regex101

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

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

以下是如何阅读正则表达式。^ =是字符串的开头,[a-zA-Z] =后跟a到z之间的任何小写字符或a到z之间的任何大写字符中的一个,[a-zA-Z0-9_]{7,29} =后跟a到z之间的任何小写字符之一,或a到z之间的任何大写字符,或0到9之间的任何个位数,或下划线(最少出现7次,最多出现29次,$ =后跟字符串的末尾

如果你试着像"这个"、"这个"one_answers"这个"这样说,就会更容易理解。。。。等等。

一旦你明白了,你就得到了问题的答案。

最新更新