【问题标题】:Hacker rank java string regex username黑客等级 java 字符串正则表达式用户名
【发布时间】:2016-05-06 19:32:05
【问题描述】:

问题是根据这些规则在一系列字符串中识别有效的用户名。

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

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

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

输入和输出已经为我处理好了,他们只需要正则表达式。

我有“^[a-zA-Z][a-zA-Z0-9_]+${8,30}”

我认为在字符串的开头要求任何大小写的字母字符,后跟字母数字和下划线字符到字符串的末尾,最少 8 个字符,最多 30 个字符。此正则表达式适用于 5 出8 例。大多数不起作用的案例都很长,我不会在这里发布它们,但是有一个案例它不起作用,简短而令人困惑。

“啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊”

我的正则表达式说它是有效的,从规则来看,我认为它应该是有效的。答案说它是无效的。根据我上面所说的规则,我是否遗漏了为什么这应该是无效的?

【问题讨论】:

  • 对不起,没关系。我得到了 31 个字符

标签: java regex


【解决方案1】:

正确的正则表达式是

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

查看regex demo 表明aaaaaaaaaaaaaaaaaaaaaaaaaaaaaab 未通过测试。

当你使用${8,30}时,表示匹配字符串的结尾8到30次

我的模式匹配第一个字母字符,然后是 7 到 29 个字母、数字和下划线(总共 8 到 30 个)。

注意可以写成

^[a-zA-Z]\w{7,29}$

注意:在 Java 中,将模式声明为 Java C 字符串时,您必须使用双反斜杠。此外,如果您使用.matches(),则不需要^$

Boolean matched = input.matches("[a-zA-Z]\\w{7,29}");

【讨论】:

  • 啊,标题里说是Java。
  • ^[a-zA-Z][a-zA-Z0-9_]+${7,29} 满足所有情况。感谢您的回复 Wiktor,\w 不会允许其他非空白字符撒谎@&*!()^?根据规则,这些是非法字符。
  • \w is a word character shorthand class,它匹配[a-zA-Z0-9_] 如果你没有指定Pattern.UNICODE_CHARACTER_CLASS标志。
  • 有什么理由不使用不区分大小写的标志而不是列出大小写字母?
  • @talemyn:不区分大小写的修饰符没有真正的好处。在String.matches() 中,标志应该作为内联版本传递,(?i),它比a-z 长。 \w 已经不区分大小写了。
【解决方案2】:

这个表达式通过了所有的测试用例

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

【讨论】:

  • 这是我的解决方案的副本。
猜你喜欢
  • 1970-01-01
  • 2016-10-08
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多