用于模式xxyyzz的regex

v09wglhw  于 2021-06-29  发布在  Java
关注(0)|答案(5)|浏览(285)

我想验证一个应该遵循模式的字符串 XXYYZZ 其中x,y,z可以是任意字母a-z,a-z或0-9。
有效字符串示例:

RRFFKK
BB7733
WWDDMM
5599AA

无效:

555677
AABBCD

现在我正在使用正则表达式拆分字符串 (?<=(.))(?!\\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;
}

我想把我的检查方式改为 String#matches 并且去掉循环,但是不能得到一个有效的正则表达式。有人能帮忙放些什么吗 someRegex 在下面的片段中?

public static boolean checkPattern(String str) {
    return str.matches(someRegex);
}
4uqofj5v

4uqofj5v1#

下面这些对你有用吗?

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

查看在线演示 ^ -开始串锚。 ( -打开第一捕获组。 ( -打开第二个捕获组。 [A-Za-z\d] -任何字母数字字符。 ) -关闭第二捕获组。 \2 -和刚才抓到的完全吻合。 (?!.*\2) -负向前看,以确保同一字符不在其他地方使用。 ) -关闭第一捕获组。 {3} -重复上述步骤三次。 $ -尾绳锚。

a14dhokn

a14dhokn2#

好吧,这里有另一个结合使用regex和streams的解决方案。
它把图案分成两个字符组。
保留不同的组。
返回 true 如果计数是3。

String[] data = { "AABBBB", "AABBCC", "AAAAAA","AABBAA", "ABC", "AAABCC",
        "RRABBCCC" };
String pat = "(?:\\G(.)\\1)+";
Pattern pattern = Pattern.compile(pat);

for (String str : data) {
    Matcher m = pattern.matcher(str);
    boolean isValid = m.results().map(MatchResult::group).distinct().count() == 3;
    System.out.printf("%8s  ->  %s%n",
            str, isValid ? "Valid" : "Not Valid");
}

印刷品

AABBBB  ->  Not Valid
  AABBCC  ->  Valid
  AAAAAA  ->  Not Valid
  AABBAA  ->  Not Valid
     ABC  ->  Not Valid
  AAABCC  ->  Not Valid
RRABBCCC  ->  Not Valid
js5cn81o

js5cn81o3#

您可以检查一个字符是否与其后面的字符匹配,以及不同字符的计数是否正确 3 .
演示:

public class Main {
    public static void main(String[] args) {
        // Test
        System.out.println(isValidPattern("RRFFKK"));
        System.out.println(isValidPattern("BBAABB"));
        System.out.println(isValidPattern("555677"));
    }

    static boolean isValidPattern(String str) {
        return str.length() == 6 &&                
                str.charAt(0) == str.charAt(1) && 
                str.charAt(2) == str.charAt(3) &&
                str.charAt(4) == str.charAt(5) &&
                str.chars().distinct().count() == 3;
    }
}

输出:

true
false
false

注: String#chars 从java-9开始提供。

zlwx9yxi

zlwx9yxi4#

你可以用

s.matches("(\\p{Alnum})\\1(?!\\1)(\\p{Alnum})\\2(?!\\1|\\2)(\\p{Alnum})\\3")

查看regex演示。
细节 \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测试结果:

biswetbf

biswetbf5#

因为您知道一个有效的模式总是六个字符长,三对相等的字符彼此不同,所以一系列简短的显式条件可能比正则表达式更简单:

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);
}

相关问题