【问题标题】:How to write a regex to match this String in Java?如何在 Java 中编写一个正则表达式来匹配这个字符串?
【发布时间】:2015-08-27 08:51:59
【问题描述】:

我想对下面的字符串做一个正则表达式:

String s = "fdrt45B45";     // s is a password (just an example) with only 
                            // letters and digits(must have letters and digits)

我尝试过这种模式:

String pattern= "^(\\w{1,}|\\d{1,})$";     //but it doesn't work 

如果我的密码不包含字母或数字,我想得到一个不匹配,如果它同时包含两者,我想得到一个匹配。

我知道:\w is a word character: [a-zA-Z_0-9]\d is a digit: [0-9],但我不能混合使用 \w and \d 来获得我想要的东西。非常感谢新手的任何帮助或提示。

【问题讨论】:

标签: java regex string


【解决方案1】:

积极的前瞻就可以解决问题:

String s = "fdrt45B45";
System.out.println(s.matches("(?=.*[a-zA-Z])(?=.*\\d)[a-zA-Z0-9]+"));

【讨论】:

  • 谢谢,它就像一个魅力,我正在努力理解这个表达。
  • @dustin - (?=.*[something]) 被称为积极展望。它会寻找 something 但不会移动 pointer / reference 以指向某物。前 2 个 ?= 检查从长度 0 开始。您的实际角色 capture[a-zA-Z0-9] 开始。前 2 个表达式是 look and forget 类型。明白了吗?
【解决方案2】:

您应该能够使用以下正则表达式来实现您想要的。这使用了积极的前瞻性,并将匹配任何包含至少一个字母和至少一个数字的字符串。

^(?=.*\\d)(?=.*\\w).*

【讨论】:

  • 请注意,\w 并不是“所有字母”,而是“所有字母、数字和下划线”([a-zA-Z_0-9])。所以你的正则表达式匹配一个不需要的密码。 Documentation
  • @olambert:它不能只使用数字(我只有数字匹配),否则没关系。
  • 好的,我想我误解了你想要做的事情 - 我以为你想强制密码同时包含字母和数字。如果你只想用字母或数字匹配密码,你可以使用^[0-9A-Za-z]+$
  • @olambert:我想我误解了你想要做的事情 - 我以为你想强制密码同时包含字母和数字......**这就是我想要的**,但与:^(?=.*\\d)(?=.*\\w).* 我得到一个只有数字的匹配! - 感谢您尝试帮助我
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 1970-01-01
  • 1970-01-01
  • 2012-03-25
  • 2018-04-23
  • 2019-08-02
  • 2016-12-01
相关资源
最近更新 更多