我需要为一个用户名写一个正则表达式(实际上在比赛中)
用户名可以包含字母数字字符和/或下划线(_)。
用户名必须以字母字符开头。
8≤|用户名| ≤30。
现在我写的正则表达式是
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个字符之间?
另一个问题为什么有必要在表达式的开头给出^,在表达式的最后给出$?(我知道它们可以作为边界但无法理解如何?所以如果有人能够解释的话)
答案 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个字符的字符串将匹配您的模式:
再次尝试添加边界标记(^
和$
),您会发现它会失败。
答案 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次,$ =
后跟字符串结尾
如果你试图说出这个"这个"它会更容易理解。其次是"这个"其次是"这个" ....等...
一旦你明白了,你就得到了问题的答案。