import java.util.regex.Pattern; public class SequenceValidator { // Ardışık alfabetik kontrolleri private static final String ALPHA_SEQUENCE_FORWARD = "(?:(?:a(?=b(?=c))|b(?=c(?=d))|c(?=d(?=e))|d(?=e(?=f))|e(?=f(?=g))|" + "f(?=g(?=h))|g(?=h(?=i))|h(?=i(?=j))|i(?=j(?=k))|j(?=k(?=l))|" + "k(?=l(?=m))|l(?=m(?=n))|m(?=n(?=o))|n(?=o(?=p))|o(?=p(?=q))|" + "p(?=q(?=r))|q(?=r(?=s))|r(?=s(?=t))|s(?=t(?=u))|t(?=u(?=v))|" + "u(?=v(?=w))|v(?=w(?=x))|w(?=x(?=y))|x(?=y(?=z)))\\w\\w)"; private static final String ALPHA_SEQUENCE_BACKWARD = "(?:(?:z(?=y(?=x))|y(?=x(?=w))|x(?=w(?=v))|w(?=v(?=u))|v(?=u(?=t))|" + "u(?=t(?=s))|t(?=s(?=r))|s(?=r(?=q))|r(?=q(?=p))|q(?=p(?=o))|" + "p(?=o(?=n))|o(?=n(?=m))|n(?=m(?=l))|m(?=l(?=k))|l(?=k(?=j))|" + "k(?=j(?=i))|j(?=i(?=h))|i(?=h(?=g))|h(?=g(?=f))|g(?=f(?=e))|" + "f(?=e(?=d))|e(?=d(?=c))|d(?=c(?=b))|c(?=b(?=a)))\\w\\w)"; // Ardışık sayı kontrolleri private static final String NUMERIC_SEQUENCE_FORWARD = "(?:(?:0(?=1(?=2))|1(?=2(?=3))|2(?=3(?=4))|3(?=4(?=5))|4(?=5(?=6))|" + "5(?=6(?=7))|6(?=7(?=8))|7(?=8(?=9)))\\d{2})"; private static final String NUMERIC_SEQUENCE_BACKWARD = "(?:(?:9(?=8(?=7))|8(?=7(?=6))|7(?=6(?=5))|6(?=5(?=4))|5(?=4(?=3))|" + "4(?=3(?=2))|3(?=2(?=1))|2(?=1(?=0)))\\d{2})"; // Türkçe karakterler ve özel karakterler private static final String SPECIAL_CHARS = "!,.@+$#&üğışçöÜĞIŞÇÖ"; // Karakter tekrarı kontrolü (en fazla 2 kere) private static final String NO_TRIPLE_REPEAT = "^(?!.*([a-zA-Z" + Pattern.quote(SPECIAL_CHARS) + "]).*\\1.*\\1)"; // Ana pattern private static final Pattern VALIDATION_PATTERN = Pattern.compile( NO_TRIPLE_REPEAT + // Üçlü tekrar kontrolü "(?!.*(" + ALPHA_SEQUENCE_FORWARD + "|" + ALPHA_SEQUENCE_BACKWARD + "|" + NUMERIC_SEQUENCE_FORWARD + "|" + NUMERIC_SEQUENCE_BACKWARD + "))[a-zA-Z0-9" + Pattern.quote(SPECIAL_CHARS) + "]{6,20}$" ); public static boolean isValid(String text) { if (text == null || text.isEmpty()) { return false; } return VALIDATION_PATTERN.matcher(text.toLowerCase()).matches(); } public static void main(String[] args) { // Test örnekleri String[] testCases = { "aabbcc", // Geçerli (ikili tekrar) "aaabbb", // Geçersiz (üçlü tekrar) "Test!!!", // Geçersiz (! üç kere tekrar ediyor) "Test@12!", // Geçerli "aab123", // Geçerli "aaab123", // Geçersiz (a üç kere tekrar ediyor) "abc123", // Geçersiz (ardışık) "Test@@1", // Geçerli (@ iki kere) "Şifre!!1", // Geçerli (! iki kere) "AABBcc11", // Geçerli "AAABBcc11", // Geçersiz (A üç kere) "Test.12.@", // Geçerli "ab12cd56", // Geçerli "aaa12345", // Geçersiz (a üç kere) "ŞŞŞtest1", // Geçersiz (Ş üç kere) "ĞĞtest1" // Geçerli (Ğ iki kere) }; for (String test : testCases) { boolean result = isValid(test); System.out.printf("'%s': %s (Uzunluk: %d)%n", test, result ? "Geçerli" : "Geçersiz", test.length() ); } } }