正则表达式:/ w表示[a-zA-Z]或[a-zA-Z0-9_],因为大多数教程都提到\ w - 匹配单词字符?

时间:2016-09-21 02:28:36

标签: java regex

我刚开始使用正则表达式,并且正在解决此question,其中的任务是检查该用户名是否有效。有效的用户名将具有以下属性:

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

  3. 8< =(用户名长度)< = 30。

  4. 我正在使用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>

4 个答案:

答案 0 :(得分:3)

在正则表达式中,\w等效于[a-zA-Z0-9_],因此它将匹配字母aB3_等。您将必须使用\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代表“单词字符”。它匹配的确切字符有所不同 正则表达式引擎之间。

  1. 在所有引擎中,它将包括[A-Za-z]。
  2. 在大多数情况下,还包括下划线和数字。
  3. 在某些引擎中,其他语言的单词字符也可能匹配。
  4. 最好的方法是使用正在使用的正则表达式引擎进行几项测试。写一个测试字符串并通过正则表达式\ w搜索以查看它匹配的内容。