我有一个要求,即一个名字不能以3个相同的字母开头而忽略它们的情况.名称以大写字母开头,后跟小写字母.
基本上我可以将整个名称转换为大写,然后匹配正则表达式(\p{Lu})\1{3,}.*.
但我想知道是否存在符合上述要求的正则表达式,并且不需要对要匹配的字符串进行任何预处理.那么我可以使用什么正则表达式匹配字符串Aa,Dd或者Uu没有明确指定任何可能的组合?
编辑:
我接受了Markos的回答.我只需要修复它以使用长度为1和2的名称并将其锚定在开头.所以我的用例的实际正则表达式是^(\p{Lu})(\p{Ll}?$|(?=\p{Ll}{2})(?i)(?!(\1){2})).
我也赞成了Evgeniy和sp00m的答案,帮助我学习正则表达式的一课.
谢谢你的努力.
我承认站在巨人的肩膀上(这里的其他海报),但这个解决方案实际上适用于您的用例:
final String[] strings = { "Aba", "ABa", "aba", "aBa", "Aaa", "Aab" };
final Pattern p = Pattern.compile("(\\p{Lu})(?=\\p{Ll}{2})(?i)(?!(\\1){2})");
for (String s : strings) System.out.println(s + ": " + p.matcher(s).find());
Run Code Online (Sandbox Code Playgroud)
现在我们有:
输出:
阿巴:确实如此 阿巴:假的 阿巴:假的 阿巴:假的 啊啊:假的 阿布:是的