我想验证一个应该遵循模式的字符串 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);
}
5条答案
按热度按时间4uqofj5v1#
下面这些对你有用吗?
查看在线演示
^
-开始串锚。(
-打开第一捕获组。(
-打开第二个捕获组。[A-Za-z\d]
-任何字母数字字符。)
-关闭第二捕获组。\2
-和刚才抓到的完全吻合。(?!.*\2)
-负向前看,以确保同一字符不在其他地方使用。)
-关闭第一捕获组。{3}
-重复上述步骤三次。$
-尾绳锚。a14dhokn2#
好吧,这里有另一个结合使用regex和streams的解决方案。
它把图案分成两个字符组。
保留不同的组。
返回
true
如果计数是3。印刷品
js5cn81o3#
您可以检查一个字符是否与其后面的字符匹配,以及不同字符的计数是否正确
3
.演示:
输出:
注:
String#chars
从java-9开始提供。zlwx9yxi4#
你可以用
查看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测试结果:
biswetbf5#
因为您知道一个有效的模式总是六个字符长,三对相等的字符彼此不同,所以一系列简短的显式条件可能比正则表达式更简单: