模式 XXYYZZ 的正则表达式

nop*_*ens 12 java regex string

我想验证一个字符串,它应该遵循XXYYZZX、Y、Z 可以是任何字母 az、AZ 或 0-9 的模式。

有效字符串示例:

RRFFKK
BB7733
WWDDMM
5599AA
Run Code Online (Sandbox Code Playgroud)

无效:

555677
AABBCD
Run Code Online (Sandbox Code Playgroud)

现在我正在使用正则表达式拆分字符串(?<=(.))(?!\\1)并迭代结果数组并检查每个子字符串的长度是否为 2。

String str = "AABBEE";
boolean isValid = checkPattern(str);

public static boolean checkPattern(String str) {
   String splited = str.split("(?<=(.))(?!\\1)");
   for (String s : splited) {
       if (s.length() != 2) {
         return false;
       }
   }
   return true;
}
Run Code Online (Sandbox Code Playgroud)

我想替换我的检查方式String#matches并摆脱循环,但无法提出有效的正则表达式。有人可以帮助someRegex在下面的代码段中放入什么吗?

public static boolean checkPattern(String str) {
    return str.matches(someRegex);
}
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 10

您可以使用

s.matches("(\\p{Alnum})\\1(?!\\1)(\\p{Alnum})\\2(?!\\1|\\2)(\\p{Alnum})\\3")
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

细节

  • \A- 字符串的开始(隐含在 中String#matches) - 字符串的开始
  • (\p{Alnum})\1 - 一个字母数字字符(捕获到第 1 组中)和紧随其后的相同字符
  • (?!\1) - 下一个字符不能与组 1 中的相同
  • (\p{Alnum})\2 - 一个字母数字字符(捕获到第 2 组中)和紧随其后的相同字符
  • (?!\1|\2) - 下一个字符不能与组 1 和组 2 中的相同
  • (\p{Alnum})\3 - 一个字母数字字符(捕获到第 3 组中)和紧随其后的相同字符
  • \z- (隐含在String#matches) - 字符串的结尾。

RegexPlanet 测试结果:

在此处输入图片说明


Mur*_*nik 6

由于您知道有效模式的长度始终为六个字符,其中包含三对彼此不同的相等字符,因此一系列简短的显式条件可能比正则表达式更简单:

public static boolean checkPattern(String str) {
   return str.length() == 6 &&
          str.charAt(0) == str.chatAt(1) &&
          str.charAt(2) == str.chatAt(3) &&
          str.charAt(4) == str.chatAt(5) &&
          str.charAt(0) != str.charAt(2) &&
          str.charAt(0) != str.charAt(4) &&
          str.charAt(2) != str.charAt(4);
}
Run Code Online (Sandbox Code Playgroud)


Jvd*_*vdV 6

以下对你有用吗?

^(([A-Za-z\d])\2(?!.*\2)){3}$
Run Code Online (Sandbox Code Playgroud)

看在线演示


  • ^ - 开始字符串锚。
  • (- 打开第一个捕获组。
    • ( - 打开第二个捕获组。
      • [A-Za-z\d] - 任何字母数字字符。
      • ) - 关闭第二个捕获组。
    • \2 - 完全匹配刚刚捕获的内容。
    • (?!.*\2) - 负前瞻以确保在其他地方不会使用相同的字符。
    • ) - 关闭第一个捕获组。
  • {3} - 重复以上三遍。
  • $ - 结束字符串锚。

  • (你可以使外部组不捕获并使用“\1”)但是很好++ (5认同)
  • @Thefourthbird,谢谢,你是对的。这样就比较简单了。从最初的描述来看,这一点并不明显。郑重声明:有效的完整简化正则表达式为: `^(?:([A-Za-z\d])\1(?!.*\1)){3}$` (2认同)