我刚开始使用正则表达式,并且正在解决此question,其中的任务是检查该用户名是否有效。有效的用户名将具有以下属性:
用户名必须以字母字符开头。
8< =(用户名长度)< = 30。
我正在使用this 作为我的参考说
\ w匹配单词字符。
我想出了一个像String pattern = "^\\w(\\d|\\w|_){7,29}$";
这样的解决方案,这不是正确的解决方案。
经过一段时间的搜索,我找到了正确的解决方案
String pattern = "^[a-zA-Z][a-zA-Z0-9_]{7,29}$";
这一点很清楚。
我要确认的是(\\w|\\d|_)
是否等同于[a-zA-Z0-9_]
?
我认为这是因为所有测试用例都接受String pattern = "^[a-zA-z](\\w|\\d|_){7,29}$";
。
此外,此stackoverflow post有两个不同的\\w
等效表达式作为答案,每个表达一个upvote,想知道哪一个是正确的[A-Za-z\s]
或[A-Za-z0-9_]
?< / p>
答案 0 :(得分:3)
在正则表达式中,\w
等效于[a-zA-Z0-9_]
,因此它将匹配字母a
,B
,3
,_
等。您将必须使用\w+
的单词。加号表示一次或多次。 https://regex101.com是测试正则表达式并了解其功能的绝佳网站。
答案 1 :(得分:2)
是的,根据这里找到的正则表达式结构的Java摘要:https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html,
\d A digit: [0-9]
\w A word character: [a-zA-Z_0-9]
所以(\w|\d|_)
相当于([a-zA-Z_0-9]|[0-9]|_)
,其中额外的下划线是多余的,因为它包含在\w
中。
答案 2 :(得分:1)
好的,经过一段时间的思考并尝试了一些不同的解决方案question
事实上, \w
相当于[A-Za-z0-9_]
这也在官方文件中给出。
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
不是answer中所述的[a-zA-Z\s]
。
并且对于所有测试用例都接受question String pattern = ^[a-zA-Z]\\w{7,29};
,并且在我看来可能是最短的答案。
然而,虽然(\\w|\\d|_)
等同于[a-zA-Z0-9_]
,但仅使用\\w
就足够了。
P.S。在学习阶段遇到疑问时始终坚持官方文档,而不是任何人在任何地方的回答或教程。 希望这可以帮助有同样疑问的人。
编辑:谢谢@ 4castle @trey的建议。答案 3 :(得分:0)
\ w代表“单词字符”。它匹配的确切字符有所不同 正则表达式引擎之间。
最好的方法是使用正在使用的正则表达式引擎进行几项测试。写一个测试字符串并通过正则表达式\ w搜索以查看它匹配的内容。