我刚开始使用正则表达式,就是要解决这个问题,其中的任务是检查用户名是否有效。有效的用户名将具有以下属性:
用户名可以包含字母数字字符和/或
下划线(_)。
用户名必须以字母字符开头。
8 <=(用户名长度)<= 30。
我正在用这个
作为我的参考说
\w Matches the word characters.
我想出了一个像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帖子对\\w有两个不同的等效表达式,每个答案都有一个上投票,想知道哪个是正确的[A-Za-z\s]或[a-zA-Z0-9_]吗?
我不确定这是否是Stack Overflow的问题。对于了解正则表达式的人来说,\w等同于[A-Za-z0-9_]
我想是的,但是这里仍然存在与此相关的问题,他们的回答令人困惑,我相信这可以帮助像我这样的初学者。
我不知道,但是如果您觉得这是完全不合适的,那么我可以删除它吗?但是对于我来说,花了我一段时间才发现 w是[A-Za-z0-9_],而不仅仅是它通常提到的[A-Za-z],但并不是那么具体。就像这里只说" w-匹配单词字符"。
查看以下文档:docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html,其中列出了预定义的字符类。
是的,我看到我相信我应该以此为参考,但是这篇文章会引起混乱吗?
我同意这对初学者来说很混乱。该教程的功能确实含糊不清,但是您的问题针对的是特定的字符组合,并且也许强调\w的含义对于初学者来说是更好的问答方式。可以将其归结为一点,以便其他人可以快速查看此问题是否是他们要查找的内容。
感谢您的建议,我对标题进行了一些更改,还有什么我应该做的?
是的,根据此处找到的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中。
好吧,考虑了一段时间之后,尝试解决该问题的其他解决方案
实际上,\w等效于[A-Za-z0-9_]
官方文档中也有提供。
https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html
不是此答案中所述的[a-zA-Z\s]。
至于String pattern = ^[a-zA-Z]\\w{7,29};这个问题已被所有测试用例接受,对我来说,这似乎是最短的答案。
因此,尽管(\\w|\\d|_)等效于[A-Za-z0-9_],但仅使用\\w就足够了。
附:在学习阶段如有疑问,请始终坚持使用官方文档,而不是在任何地方都没有任何人的答案或教程。
希望这对有同样疑问的人有所帮助。
编辑:谢谢@ 4castle @trey的建议。
w代表"文字字符"。确切匹配的字符不同
在正则表达式引擎之间。
在所有引擎中,它将包括[A-Za-z]。
在大多数情况下,也包括下划线和数字。
在某些引擎中,其他语言的文字字符也可能匹配。
找出答案的最佳方法是使用正则表达式引擎进行几次测试。编写一个测试字符串,然后通过正则表达式 w搜索以查看其匹配项。
In most, the underscore and digits are also included-能否请举一个例子说明这种情况?