import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class BonusExercises { /* complete the method below, so it will validate an email address 1. Must have exactly one @ (no more, no less) 2. Split into local-part and domain (before @ and after @) 3. Local-part rules: - Can't be empty - Can't start or end with dot - Can't have two dots in a row 4. Domain rules: - Can't be empty - Can't start or end with hyphen - Can't have underscores - Each segment (between dots) must follow same hyphen rules */ public boolean validateEmail(String email) { String regex = "^[a-zA-z0-9_+-]+(?:\\.[a-zA-Z0-9_+-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z0-9-]+$"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(email); return matcher.matches(); } /* This method should find and return the first date in a string. Supported formats: - American: MM/DD/YYYY (e.g., 12/09/2023) - British: DD/MM/YYYY (e.g., 12/09/2023 — same pattern, context matters) - ISO: YYYY-MM-DD (e.g., 2024-07-15) - Slash variant: YYYY/MM/DD (e.g., 2025/01/01) If no match for a date is found in the string, return null. */ public String findDate(String string) { String regex1 = "(0[1-9]|1[0-2])\\/(0[1-9]|[12][0-9]|30)\\/\\d{4}|(0[1-9]|[12][0-9]|30)\\/(0[1-9]|1[0-2])\\/\\d{4}"; String regex2 = "(\\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|30))"; String regex3 = "(\\d{4}\\/(0[1-9]|1[0-2])\\/(0[1-9]|[12][0-9]|30))"; Pattern pattern = Pattern.compile(regex1 + "|" + regex2 + "|" + regex3); Matcher matcher = pattern.matcher(string); if(matcher.find()){ return matcher.group(); } return null; } /* given a string, implement the method to detect all valid passwords then, it should return the count of them a valid password has the following properties: - at least 8 characters - has to include at least one uppercase letter, and at least a lowercase - at least one number and at least a special char "!@#$%^&*" - has no white-space in it */ public int findValidPasswords(String string) { String regex = "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[!@#$%^&*]).{8,}$"; Pattern pattern = Pattern.compile(regex); String[] parts = string.split("\\s+"); int counter = 0; for(String part : parts){ Matcher matcher = pattern.matcher(part); if(matcher.matches()){ counter++; } } return counter; } /* you should return a list of *words* which are palindromic by word we mean at least 3 letters with no whitespace in it note: your implementation should be case-insensitive, e.g. Aba -> is palindrome */ public List findPalindromes(String string) { List list = new ArrayList<>(); // todo return list; } public static void main(String[] args) { // you can test your code here } }