正则表达式中的错误

时间:2016-03-22 04:31:15

标签: regex

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

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

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

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

  4. 现在我写的正则表达式是

    String pattern =“(^ [a-zA-Z] [a-zA-Z0-9 _] {8,30} $)”;

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

    String pattern =“(^ [a-zA-Z] [a-zA-Z0-9 _] {7,29} $)”;

    现在我无法理解为什么使用{7,29}代替{8,30},因为用户名必须介于8到30个字符之间?

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

2 个答案:

答案 0 :(得分:1)

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

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

{7,29}量词指的是匹配[a-zA-Z0-9_]的字符。所以这意味着必须存在7到29(含)之间的这个特征。此外,还有第一个必须与[a-zA-Z]匹配的字符。将其添加到范围中可提供8到30个字符(包括)。

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

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

Regex101

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

答案 1 :(得分:1)

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

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

如果你试图说出这个"这个"它会更容易理解。其次是"这个"其次是"这个" ....等...

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