gpt4 book ai didi

java - 正则表达式精确匹配 n 次出现的字母和 m 次出现的数字

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:18:25 25 4
gpt4 key购买 nike

我必须匹配一个 8 个字符的字符串,它可以包含恰好 2 个字母(1 个大写和 1 个小写)和恰好 6 个数字,但它们可以任意排列。

所以,基本上:

  • K82v6686 会通过
  • 3w28E020 会通过
  • 1276eQ900 会失败(太长)
  • 98Y78k9k 会失败(三个字母)
  • A09B2197 会失败(两个大写字母)

我已经尝试使用正向前瞻来确保字符串包含数字、大写和小写字母,但我无法将它限制在特定的出现次数。我想我可以通过包含字母和数字可能出现的位置的所有可能组合来解决这个问题:

(?=.*[0-9])(?=.*[A-Z])(?=.*[a-z]) ([A-Z][a-z][0-9]{6})|([A-Z][0-9][a-z][0-9]{5})| ... | ([0-9]{6}[a-z][A-Z])

但这是一种非常迂回的做法,我想知道是否有更好的解决方案。

最佳答案

你可以使用

^(?=[^A-Z]*[A-Z][^A-Z]*$)(?=[^a-z]*[a-z][^a-z]*$)(?=(?:\D*\d){6}\D*$)[a-zA-Z0-9]{8}$

参见 regex demo (由于多行输入而有所修改)。在 Java 中,不要忘记使用双反斜杠(例如 \\d 来匹配数字)。

这是一个分割:

  • ^ - 字符串的开始(假设不使用多行标志)
  • (?=[^A-Z]*[A-Z][^A-Z]*$) - 检查是否只有 1 个大写字母(使用 \p{Lu} 匹配任何 Unicode 大写字母和 \P{Lu} 匹配除此之外的任何字符)
  • (?=[^a-z]*[a-z][^a-z]*$) - 类似检查是否只有 1 个小写字母(或者,使用 \p{Ll} \P{Ll} 来匹配 Unicode 字母)
  • (?=(?:\D*\d){6}\D*$) - 检查字符串中是否有六位数字(=从字符串的开头开始,有可以是0个或多个非数字符号(\D匹配除数字以外的任何字符,你也可以用[^0-9]替换),然后是一个数字 (\d),然后是 0 个或多个非数字字符 (\D*),直到字符串 ($ >)) 然后
  • [a-zA-Z0-9]{8} - 正好匹配 8 个字母数字字符。
  • $ - 字符串结尾。

按照逻辑,我们甚至可以将其简化为

^(?=[^a-z]*[a-z][^a-z]*$)(?=(?:\D*\d){6}\D*$)[a-zA-Z0-9]{8}$

可以删除一个条件,因为我们只允许使用 [a-zA-Z0-9] 的大小写字母和数字,当我们应用 2 个条件时,第 3 个条件会自动执行匹配字符串(在这种情况下,一个字符必须是大写)。

与Java matches() 方法一起使用时,不需要在开始和结束时使用^$ anchor 模式,但在前瞻中您仍然需要它:

String s = "K82v6686";
String rx = "(?=[^a-z]*[a-z][^a-z]*$)" + // 1 lowercase letter check
"(?=(?:\\D*\\d){6}\\D*$)" + // 6 digits check
"[a-zA-Z0-9]{8}"; // matching 8 alphanum chars exactly
if (s.matches(rx)) {
System.out.println("Valid");
}

关于java - 正则表达式精确匹配 n 次出现的字母和 m 次出现的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33777047/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com