Exemples de Traitement de Chaînes Android Kotlin

Exemples de traitement de chaînes Android Kotlin incluant la division et la jointure de chaînes, les expressions régulières et le remplacement de chaînes

💻 Division et Jointure de Chaînes kotlin

🟢 simple ⭐⭐

Diviser les chaînes par des délimiteurs et joindre des collections de chaînes avec divers séparateurs

⏱️ 15 min 🏷️ kotlin, android, string processing
Prerequisites: Basic Kotlin knowledge
// Android Kotlin String Split and Join Examples
// Kotlin standard library string operations

// 1. Basic String Splitting
class StringSplitter {

    // Split by single delimiter
    fun splitByDelimiter(text: String, delimiter: String): List<String> {
        return text.split(delimiter)
    }

    // Split by multiple delimiters
    fun splitByMultipleDelimiters(text: String, delimiters: List<String>): List<String> {
        var result = listOf(text)
        for (delimiter in delimiters) {
            result = result.flatMap { it.split(delimiter) }
        }
        return result.filter { it.isNotEmpty() }
    }

    // Split by regex pattern
    fun splitByRegex(text: String, pattern: String): List<String> {
        val regex = Regex(pattern)
        return text.split(regex)
    }

    // Split with limit
    fun splitWithLimit(text: String, delimiter: String, limit: Int): List<String> {
        return text.split(delimiter, limit = limit)
    }

    // Split into lines
    fun splitIntoLines(text: String): List<String> {
        return text.lines()
    }

    // Split by whitespace
    fun splitByWhitespace(text: String): List<String> {
        return text.split(Regex("\\s+"))
    }

    // Split and trim
    fun splitAndTrim(text: String, delimiter: String): List<String> {
        return text.split(delimiter)
            .map { it.trim() }
            .filter { it.isNotEmpty() }
    }
}

// 2. String Joining
class StringJoiner {

    // Join with delimiter
    fun joinWithDelimiter(parts: List<String>, delimiter: String): String {
        return parts.joinToString(delimiter)
    }

    // Join with prefix and suffix
    fun joinWithPrefixSuffix(
                    parts: List<String>,
                    delimiter: String,
                    prefix: String,
                    suffix: String
    ): String {
        return parts.joinToString(delimiter, prefix, suffix)
    }

    // Join with limit and truncated
    fun joinWithLimit(
                    parts: List<String>,
                    delimiter: String,
                    limit: Int,
                    truncated: String
    ): String {
        return parts.joinToString(
            separator = delimiter,
            limit = limit,
            truncated = truncated
        )
    }

    // Join with transformation
    fun joinWithTransform(
                    parts: List<String>,
                    delimiter: String,
                    transform: (String) -> String
    ): String {
        return parts.joinToString(delimiter) { transform(it) }
    }

    // Join non-null elements
    fun joinNonNull(parts: List<String?>, delimiter: String): String {
        return parts.filterNotNull().joinToString(delimiter)
    }

    // Join lines
    fun joinLines(lines: List<String>): String {
        return lines.joinToString("\\n")
    }

    // Join with index
    fun joinWithIndex(parts: List<String>, delimiter: String): String {
        return parts.mapIndexed { index, s -> "$index: $s" }
            .joinToString(delimiter)
    }
}

// 3. Advanced String Operations
class AdvancedStringOperations {

    // Parse CSV line
    fun parseCSVLine(line: String): List<String> {
        return line.split(",").map { it.trim() }
    }

    // Parse key-value pairs
    fun parseKeyValuePairs(text: String, pairDelimiter: String, kvDelimiter: String):
            Map<String, String> {
        return text.split(pairDelimiter)
            .mapNotNull { pair ->
                val parts = pair.split(kvDelimiter, limit = 2)
                if (parts.size == 2) {
                    parts[0].trim() to parts[1].trim()
                } else {
                    null
                }
            }
            .toMap()
    }

    // Split and preserve delimiters
    fun splitPreservingDelimiters(text: String, delimiters: List<String>): List<String> {
        var result = text
        val parts = mutableListOf<String>()

        for (delimiter in delimiters) {
            val temp = result.split(delimiter)
            if (temp.size > 1) {
                parts.addAll(temp.dropLast(1))
                parts.add(delimiter)
                result = temp.last()
            }
        }
        parts.add(result)
        return parts
    }

    // Word wrap
    fun wordWrap(text: String, maxWidth: Int): List<String> {
        val words = text.split(Regex("\\s+"))
        val lines = mutableListOf<String>()
        var currentLine = ""

        for (word in words) {
            val testLine = if (currentLine.isEmpty()) word else "$currentLine $word"
            if (testLine.length <= maxWidth) {
                currentLine = testLine
            } else {
                if (currentLine.isNotEmpty()) {
                    lines.add(currentLine)
                }
                currentLine = word
            }
        }

        if (currentLine.isNotEmpty()) {
            lines.add(currentLine)
        }

        return lines
    }
}

// 4. String Builder for Efficient Building
class EfficientStringBuilder {

    // Build string with StringBuilder
    fun buildStringEfficiently(parts: List<String>): String {
        return buildString {
            for (part in parts) {
                append(part)
                append(" ")
            }
        }.trim()
    }

    // Build with conditional parts
    fun buildWithConditionals(
                    base: String,
                    optional: String?,
                    condition: Boolean
    ): String {
        return buildString {
            append(base)
            if (condition && optional != null) {
                append(" ")
                append(optional)
            }
        }
    }
}

// Main demonstration
fun demonstrateStringSplitJoin() {
    println("=== Android Kotlin String Split and Join Examples ===\n")

    val splitter = StringSplitter()

    // 1. Basic split
    println("--- 1. Basic Split ---")
    val text1 = "apple,banana,orange,grape"
    val fruits = splitter.splitByDelimiter(text1, ",")
    println("Split '$text1':")
    fruits.forEach { println("  - $it") }

    // 2. Split by multiple delimiters
    println("\n--- 2. Split by Multiple Delimiters ---")
    val text2 = "apple,banana;orange|grape"
    val multiDelim = splitter.splitByMultipleDelimiters(text2, listOf(",", ";", "|"))
    println("Split by [,,;,|]:")
    multiDelim.forEach { println("  - $it") }

    // 3. Split by regex
    println("\n--- 3. Split by Regex ---")
    val text3 = "apple123banana456orange"
    val regexSplit = splitter.splitByRegex(text3, "\\d+")
    println("Split by digits:")
    regexSplit.forEach { println("  - $it") }

    // 4. Split into lines
    println("\n--- 4. Split into Lines ---")
    val text4 = "Line 1\\nLine 2\\nLine 3"
    val lines = splitter.splitIntoLines(text4)
    println("Lines:")
    lines.forEach { println("  - $it") }

    // 5. Join with delimiter
    println("\n--- 5. Join with Delimiter ---")
    val joiner = StringJoiner()
    val joined = joiner.joinWithDelimiter(fruits, " | ")
    println("Joined with ' | ': $joined")

    // 6. Join with prefix and suffix
    println("\n--- 6. Join with Prefix/Suffix ---")
    val joinedWithBrackets = joiner.joinWithPrefixSuffix(
        fruits,
        ", ",
        "[",
        "]"
    )
    println("Joined with brackets: $joinedWithBrackets")

    // 7. Join with limit
    println("\n--- 7. Join with Limit ---")
    val manyItems = (1..20).map { "Item$it" }
    val joinedLimited = joiner.joinWithLimit(
        manyItems,
        ", ",
        limit = 5,
        truncated = "..."
    )
    println("Limited join: $joinedLimited")

    // 8. Parse CSV
    println("\n--- 8. Parse CSV ---")
    val advanced = AdvancedStringOperations()
    val csvLine = "John,Doe,30,New York"
    val parsedCSV = advanced.parseCSVLine(csvLine)
    println("Parsed CSV:")
    println("  Name: ${parsedCSV[0]} ${parsedCSV[1]}")
    println("  Age: ${parsedCSV[2]}")
    println("  City: ${parsedCSV[3]}")

    // 9. Parse key-value pairs
    println("\n--- 9. Parse Key-Value Pairs ---")
    val kvText = "name=John;age=30;city=NYC"
    val kvPairs = advanced.parseKeyValuePairs(kvText, ";", "=")
    println("Parsed key-values:")
    kvPairs.forEach { (key, value) ->
        println("  $key: $value")
    }

    // 10. Word wrap
    println("\n--- 10. Word Wrap ---")
    val longText = "This is a very long text that needs to be wrapped into multiple lines"
    val wrapped = advanced.wordWrap(longText, 20)
    println("Wrapped text:")
    wrapped.forEach { println("  $it") }

    println("\n=== All String Split and Join Examples Completed ===")
}

💻 Remplacement de Chaînes kotlin

🟢 simple ⭐⭐⭐

Rechercher et remplacer du texte en utilisant des modèles simples, regex et une logique personnalisée

⏱️ 20 min 🏷️ kotlin, android, string processing
Prerequisites: Basic Kotlin knowledge
// Android Kotlin String Replacement Examples
// Kotlin standard library replacement methods

// 1. Basic String Replacement
class BasicReplacer {

    // Replace single occurrence
    fun replaceFirst(text: String, oldValue: String, newValue: String): String {
        return text.replace(oldValue, newValue)
    }

    // Replace all occurrences (case-sensitive)
    fun replaceAll(text: String, oldValue: String, newValue: String): String {
        return text.replace(oldValue, newValue)
    }

    // Replace all occurrences (case-insensitive)
    fun replaceAllIgnoreCase(text: String, oldValue: String, newValue: String): String {
        return text.replace(Regex(oldValue, RegexOption.IGNORE_CASE), newValue)
    }

    // Replace first N occurrences
    fun replaceFirstN(text: String, oldValue: String, newValue: String, n: Int): String {
        var count = 0
        var result = text
        var index = result.indexOf(oldValue)

        while (index != -1 && count < n) {
            result = result.substring(0, index) + newValue +
                    result.substring(index + oldValue.length)
            count++
            index = result.indexOf(oldValue)
        }

        return result
    }

    // Replace after index
    fun replaceAfterIndex(
                    text: String,
                    oldValue: String,
                    newValue: String,
                    startIndex: Int
    ): String {
        val before = text.substring(0, startIndex)
        val after = text.substring(startIndex)
        return before + after.replace(oldValue, newValue)
    }
}

// 2. Regex-Based Replacement
class RegexReplacer {

    // Replace using regex pattern
    fun replaceByPattern(text: String, pattern: String, replacement: String): String {
        val regex = Regex(pattern)
        return text.replace(regex, replacement)
    }

    // Replace digits with placeholder
    fun replaceDigits(text: String, replacement: String): String {
        return text.replace(Regex("\\d"), replacement)
    }

    // Replace multiple spaces with single space
    fun replaceMultipleSpaces(text: String): String {
        return text.replace(Regex("\\s+"), " ")
    }

    // Replace HTML tags
    fun replaceHTMLTags(text: String, replacement: String): String {
        return text.replace(Regex("<[^>]*>"), replacement)
    }

    // Replace email with masked version
    fun replaceEmailWithMask(text: String): String {
        return text.replace(
            Regex("([A-Za-z0-9])[A-Za-z0-9+_.-]+(@[A-Za-z0-9.-]+)"),
            "$1***$2"
        )
    }

    // Replace using callback/transform
    fun replaceWithTransform(text: String, pattern: String, transform: (MatchResult) -> String): String {
        val regex = Regex(pattern)
        return text.replace(regex) { match -> transform(match) }
    }

    // Replace numbers with their doubled value
    fun replaceNumbersWithDouble(text: String): String {
        return text.replace(Regex("\\d+")) { match ->
            val num = match.value.toInt()
            (num * 2).toString()
        }
    }

    // Replace words in brackets with uppercase
    fun replaceBracketedWithUppercase(text: String): String {
        return text.replace(Regex("\\[(\\w+)\\]")) { match ->
            match.groupValues[1].uppercase()
        }
    }
}

// 3. Conditional Replacement
class ConditionalReplacer {

    // Replace if string contains pattern
    fun replaceIfContains(
                    text: String,
                    condition: String,
                    oldValue: String,
                    newValue: String
    ): String {
        return if (condition in text) {
            text.replace(oldValue, newValue)
        } else {
            text
        }
    }

    // Replace only whole words
    fun replaceWholeWords(text: String, word: String, replacement: String): String {
        val pattern = Regex("\\b$word\\b")
        return text.replace(pattern, replacement)
    }

    // Replace only at start of string
    fun replaceAtStart(text: String, prefix: String, replacement: String): String {
        return if (text.startsWith(prefix)) {
            replacement + text.substring(prefix.length)
        } else {
            text
        }
    }

    // Replace only at end of string
    fun replaceAtEnd(text: String, suffix: String, replacement: String): String {
        return if (text.endsWith(suffix)) {
            text.substring(0, text.length - suffix.length) + replacement
        } else {
            text
        }
    }

    // Replace between delimiters
    fun replaceBetweenDelimiters(
                    text: String,
                    startDelim: String,
                    endDelim: String,
                    replacement: String
    ): String {
        val pattern = Regex("$startDelim.*?$endDelim")
        return text.replace(pattern, "$startDelim$replacement$endDelim")
    }
}

// 4. Template-Based Replacement
class TemplateReplacer {

    // Replace placeholders in template
    fun replacePlaceholders(template: String, data: Map<String, String>): String {
        var result = template
        for ((key, value) in data) {
            result = result.replace("{{$key}}", value)
        }
        return result
    }

    // Replace with default values
    fun replaceWithDefaults(
                    template: String,
                    data: Map<String, String>,
                    defaults: Map<String, String>
    ): String {
        var result = template
        for ((key, defaultValue) in defaults) {
            val value = data[key] ?: defaultValue
            result = result.replace("{{$key}}", value)
        }
        return result
    }

    // Replace using function
    fun replaceUsingFunction(
                    template: String,
                    placeholder: String,
                    supplier: (String) -> String
    ): String {
        val pattern = Regex("\\{$placeholder\\}")
        return template.replace(pattern) { supplier(placeholder) }
    }
}

// 5. Advanced Replacement Operations
class AdvancedReplacer {

    // Replace with word count
    fun replaceWithWordCount(text: String, target: String): String {
        val words = text.split(Regex("\\s+"))
        val count = words.count { it.equals(target, ignoreCase = true) }
        return text.replace(target, "$target($count)")
    }

    // Swap two words
    fun swapWords(text: String, word1: String, word2: String): String {
        return text
            .replace(word1, "\u0000")
            .replace(word2, word1)
            .replace("\u0000", word2)
    }

    // Replace consecutive duplicates
    fun replaceConsecutiveDuplicates(text: String, replacement: String): String {
        return text.replace(Regex("\\b(\\w+)\\s+\\1\\b"), replacement)
    }

    // Replace with incrementing numbers
    fun replaceWithNumbers(text: String, placeholder: String): String {
        var counter = 1
        return text.replace(Regex(placeholder)) {
            counter++.toString()
        }
    }

    // Chain multiple replacements
    fun chainReplacements(text: String, replacements: List<Pair<String, String>>): String {
        var result = text
        for ((old, new) in replacements) {
            result = result.replace(old, new)
        }
        return result
    }

    // Replace in reverse order
    fun replaceFromEnd(text: String, oldValue: String, newValue: String): String {
        val lastIndex = text.lastIndexOf(oldValue)
        return if (lastIndex != -1) {
            text.substring(0, lastIndex) + newValue +
                    text.substring(lastIndex + oldValue.length)
        } else {
            text
        }
    }
}

// 6. Sanitization and Cleaning
class StringSanitizer {

    // Remove profanity (simple version)
    fun sanitizeProfanity(text: String, badWords: Set<String>): String {
        var result = text
        for (word in badWords) {
            val pattern = Regex("\\b${word}\\b", RegexOption.IGNORE_CASE)
            result = result.replace(pattern) { match ->
                "*".repeat(match.value.length)
            }
        }
        return result
    }

    // Clean user input
    fun cleanUserInput(text: String): String {
        return text
            .replace(Regex("<[^>]*>"), "") // Remove HTML
            .replace(Regex("\\s+"), " ") // Normalize whitespace
            .trim()
    }

    // Sanitize filename
    fun sanitizeFileName(name: String): String {
        val invalidChars = setOf('/', '\\', ':', '*', '?', '"', '<', '>', '|')
        var result = name
        for (char in invalidChars) {
            result = result.replace(char.toString(), "_")
        }
        return result
    }

    // Escape special characters
    fun escapeSpecialChars(text: String): String {
        return text
            .replace("\\", "\\\\")
            .replace(""", "\\"")
            .replace("'", "\\'")
            .replace("\n", "\\n")
            .replace("\r", "\\r")
            .replace("\t", "\\t")
    }
}

// Main demonstration
fun demonstrateStringReplacement() {
    println("=== Android Kotlin String Replacement Examples ===\n")

    val replacer = BasicReplacer()

    // 1. Basic replacement
    println("--- 1. Basic Replacement ---")
    val text1 = "Hello World, World is great"
    val replaced = replacer.replaceAll(text1, "World", "Kotlin")
    println("Original: $text1")
    println("Replaced: $replaced")

    // 2. Case-insensitive replacement
    println("\n--- 2. Case-Insensitive Replacement ---")
    val text2 = "Hello world, WORLD, World"
    val caseReplaced = replacer.replaceAllIgnoreCase(text2, "world", "There")
    println("Original: $text2")
    println("Replaced: $caseReplaced")

    // 3. Regex replacement
    println("\n--- 3. Regex Replacement ---")
    val regexReplacer = RegexReplacer()
    val text3 = "Phone: 123-456-7890"
    val masked = regexReplacer.replaceDigits(text3, "X")
    println("Original: $text3")
    println("Digits masked: $masked")

    // 4. Replace with transform
    println("\n--- 4. Replace with Transform ---")
    val text4 = "Values: 10, 20, 30"
    val doubled = regexReplacer.replaceNumbersWithDouble(text4)
    println("Original: $text4")
    println("Numbers doubled: $doubled")

    // 5. Whole word replacement
    println("\n--- 5. Whole Word Replacement ---")
    val condReplacer = ConditionalReplacer()
    val text5 = "cat catalog category cat"
    val wholeReplaced = condReplacer.replaceWholeWords(text5, "cat", "dog")
    println("Original: $text5")
    println("Whole word replaced: $wholeReplaced")

    // 6. Template replacement
    println("\n--- 6. Template Replacement ---")
    val templateReplacer = TemplateReplacer()
    val template = "Hello {name}, your order {order} is ready"
    val data = mapOf("name" to "John", "order" to "#12345")
    val filled = templateReplacer.replacePlaceholders(template, data)
    println("Template: $template")
    println("Filled: $filled")

    // 7. Advanced replacement
    println("\n--- 7. Advanced Replacement ---")
    val advanced = AdvancedReplacer()
    val text7 = "Item1, Item2, Item3"
    val numbered = advanced.replaceWithNumbers(text7, "Item\\d+")
    println("Original: $text7")
    println("Numbered: $numbered")

    // 8. Swap words
    println("\n--- 8. Swap Words ---")
    val text8 = "I like apples and oranges"
    val swapped = advanced.swapWords(text8, "apples", "oranges")
    println("Original: $text8")
    println("Swapped: $swapped")

    // 9. Sanitization
    println("\n--- 9. Sanitization ---")
    val sanitizer = StringSanitizer()
    val text9 = "Hello<script>alert('xss')</script>  World"
    val clean = sanitizer.cleanUserInput(text9)
    println("Original: $text9")
    println("Cleaned: $clean")

    val badFile = "file:name?.txt"
    println("\nInvalid filename: $badFile")
    println("Sanitized: ${sanitizer.sanitizeFileName(badFile)}")

    // 10. Masking
    println("\n--- 10. Email Masking ---")
    val text10 = "Contact us at [email protected] for help"
    val masked = regexReplacer.replaceEmailWithMask(text10)
    println("Original: $text10")
    println("Masked: $masked")

    println("\n=== All String Replacement Examples Completed ===")
}

💻 Expressions Régulières kotlin

🟡 intermediate ⭐⭐⭐⭐

Correspondance de modèles, validation, recherche et remplacement utilisant des expressions régulières

⏱️ 25 min 🏷️ kotlin, android, string processing, regex
Prerequisites: Intermediate Kotlin, Regex basics
// Android Kotlin Regular Expression Examples
// Kotlin standard library regex support

import java.util.regex.Pattern
import java.util.regex.Matcher

// 1. Basic Pattern Matching
class RegexMatcher {

    // Check if pattern matches entire string
    fun matchesFullString(text: String, pattern: String): Boolean {
        val regex = Regex(pattern)
        return regex.matches(text)
    }

    // Check if pattern contains in string
    fun containsPattern(text: String, pattern: String): Boolean {
        val regex = Regex(pattern)
        return regex.containsMatchIn(text)
    }

    // Find first match
    fun findFirstMatch(text: String, pattern: String): MatchResult? {
        val regex = Regex(pattern)
        return regex.find(text)
    }

    // Find all matches
    fun findAllMatches(text: String, pattern: String): List<MatchResult> {
        val regex = Regex(pattern)
        return regex.findAll(text).toList()
    }

    // Find matches with groups
    fun findGroupMatches(text: String, pattern: String): List<List<String>> {
        val regex = Regex(pattern)
        return regex.findAll(text).map { match ->
            match.groupValues
        }.toList()
    }
}

// 2. Common Validation Patterns
class StringValidator {

    // Validate email
    fun isValidEmail(email: String): Boolean {
        val emailPattern = Regex("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$")
        return emailPattern.matches(email)
    }

    // Validate phone number
    fun isValidPhoneNumber(phone: String): Boolean {
        val phonePattern = Regex("^\\+?[1-9]\\d{1,14}$")
        return phonePattern.matches(phone)
    }

    // Validate URL
    fun isValidURL(url: String): Boolean {
        val urlPattern = Regex(
            "^https?://[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}(/[^\\s]*)?$"
        )
        return urlPattern.matches(url)
    }

    // Validate IPv4 address
    fun isValidIPv4(ip: String): Boolean {
        val ipPattern = Regex(
            "^((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}" +
            "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$"
        )
        return ipPattern.matches(ip)
    }

    // Validate credit card (Luhn algorithm placeholder)
    fun isValidCreditCard(card: String): Boolean {
        val cardPattern = Regex("^\\d{13,19}$")
        return cardPattern.matches(card.replace("\\s", ""))
    }

    // Validate hexadecimal color
    fun isValidHexColor(color: String): Boolean {
        val colorPattern = Regex("^#?([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$")
        return colorPattern.matches(color)
    }

    // Validate strong password
    fun isStrongPassword(password: String): Boolean {
        // At least 8 chars, 1 uppercase, 1 lowercase, 1 digit, 1 special
        val passwordPattern = Regex(
            "^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)(?=.*[@$!%*?&])[A-Za-z\\d@$!%*?&]{8,}$"
        )
        return passwordPattern.matches(password)
    }

    // Validate date format (YYYY-MM-DD)
    fun isValidDate(date: String): Boolean {
        val datePattern = Regex("^\\d{4}-\\d{2}-\\d{2}$")
        return datePattern.matches(date)
    }

    // Validate username (alphanumeric, underscore, 3-20 chars)
    fun isValidUsername(username: String): Boolean {
        val usernamePattern = Regex("^[a-zA-Z0-9_]{3,20}$")
        return usernamePattern.matches(username)
    }

    // Validate postal code (US format)
    fun isValidPostalCode(code: String): Boolean {
        val postalPattern = Regex("^\\d{5}(-\\d{4})?$")
        return postalPattern.matches(code)
    }
}

// 3. Search and Extract
class RegexSearcher {

    // Extract all email addresses
    fun extractEmails(text: String): List<String> {
        val emailPattern = Regex("[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}")
        return emailPattern.findAll(text).map { it.value }.toList()
    }

    // Extract all URLs
    fun extractURLs(text: String): List<String> {
        val urlPattern = Regex("https?://[^\\s]+")
        return urlPattern.findAll(text).map { it.value }.toList()
    }

    // Extract all hashtags
    fun extractHashtags(text: String): List<String> {
        val hashtagPattern = Regex("#\\w+")
        return hashtagPattern.findAll(text).map { it.value }.toList()
    }

    // Extract all mentions
    fun extractMentions(text: String): List<String> {
        val mentionPattern = Regex("@\\w+")
        return mentionPattern.findAll(text).map { it.value }.toList()
    }

    // Extract numbers
    fun extractNumbers(text: String): List<Double> {
        val numberPattern = Regex("-?\\d+\\.\\d+|-?\\d+")
        return numberPattern.findAll(text).map { it.value.toDouble() }.toList()
    }

    // Extract dates in various formats
    fun extractDates(text: String): List<String> {
        val datePattern = Regex(
            "\\d{4}-\\d{2}-\\d{2}|\\d{2}/\\d{2}/\\d{4}|\\d{2}\\.\\d{2}\\.\\d{4}"
        )
        return datePattern.findAll(text).map { it.value }.toList()
    }

    // Extract words starting with capital
    fun extractCapitalizedWords(text: String): List<String> {
        val capitalizedPattern = Regex("\\b[A-Z][a-z]+\\b")
        return capitalizedPattern.findAll(text).map { it.value }.toList()
    }

    // Extract quoted text
    fun extractQuotedText(text: String): List<String> {
        val quotePattern = Regex(""([^"]*)"")
        return quotePattern.findAll(text).map { it.groupValues[1] }.toList()
    }
}

// 4. Text Processing with Regex
class RegexTextProcessor {

    // Remove extra whitespace
    fun normalizeWhitespace(text: String): String {
        return text.replace(Regex("\\s+"), " ").trim()
    }

    // Remove all special characters
    fun removeSpecialChars(text: String): String {
        return text.replace(Regex("[^A-Za-z0-9\\s]"), "")
    }

    // Remove all digits
    fun removeDigits(text: String): String {
        return text.replace(Regex("\\d"), "")
    }

    // Remove HTML tags
    fun removeHTMLTags(text: String): String {
        return text.replace(Regex("<[^>]*>"), "")
    }

    // Mask email (keep first 2 chars of local part)
    fun maskEmail(email: String): String {
        val emailPattern = Regex("^([A-Za-z0-9]{2})[A-Za-z0-9+_.-]+(@[A-Za-z0-9.-]+)")
        return email.replace(emailPattern, "$1***$2")
    }

    // Mask credit card (show only last 4 digits)
    fun maskCreditCard(card: String): String {
        val cleanCard = card.replace("\\s", "")
        if (cleanCard.length >= 4) {
            val last4 = cleanCard.takeLast(4)
            return "*".repeat(cleanCard.length - 4) + last4
        }
        return card
    }

    // Format phone number
    fun formatPhoneNumber(phone: String): String {
        val cleanPhone = phone.replace(Regex("[^\\d]"), "")
        return when {
            cleanPhone.length == 10 ->
                "(${cleanPhone.substring(0, 3)}) ${cleanPhone.substring(3, 6)}-${cleanPhone.substring(6)}"
            cleanPhone.length == 11 && cleanPhone.startsWith("1") ->
                "+1 (${cleanPhone.substring(1, 4)}) ${cleanPhone.substring(4, 7)}-${cleanPhone.substring(7)}"
            else -> phone
        }
    }
}

// 5. Advanced Pattern Matching
class AdvancedPatternMatcher {

    // Find repeated words
    fun findRepeatedWords(text: String): List<Pair<String, Int>> {
        val wordPattern = Regex("\\b(\\w+)\\b(?:\\s+\\b\\1\\b)+", RegexOption.IGNORE_CASE)
        return wordPattern.findAll(text).map { match ->
            match.groupValues[1] to match.value.split(Regex("\\s+")).size
        }.toList()
    }

    // Find palindromes
    fun findPalindromes(text: String): List<String> {
        val wordPattern = Regex("\\b[a-zA-Z]+\\b")
        return wordPattern.findAll(text)
            .map { it.value }
            .filter { word -> word.equals(word.reversed(), ignoreCase = true) }
            .toList()
    }

    // Validate and extract JSON-like key-value
    fun extractJSONPairs(text: String): Map<String, String> {
        val jsonPattern = Regex(""([^"]+)":\\s*"([^"]*)"")
        return jsonPattern.findAll(text).associate { match ->
            match.groupValues[1] to match.groupValues[2]
        }
    }

    // Find words with specific pattern (e.g., starts and ends with same letter)
    fun findSameStartEnd(text: String): List<String> {
        val wordPattern = Regex("\\b([a-z])\\w*\\1\\b", RegexOption.IGNORE_CASE)
        return wordPattern.findAll(text).map { it.value }.toList()
    }
}

// Main demonstration
fun demonstrateRegexPatterns() {
    println("=== Android Kotlin Regular Expression Examples ===\n")

    val matcher = RegexMatcher()

    // 1. Basic matching
    println("--- 1. Basic Pattern Matching ---")
    val text1 = "The price is $19.99"
    println("Contains price: ${matcher.containsPattern(text1, "\\\\$\\d+\\.\\d{2}")}")

    // 2. Email validation
    println("\n--- 2. Email Validation ---")
    val validator = StringValidator()
    val emails = listOf(
        "[email protected]",
        "invalid.email",
        "[email protected]"
    )
    emails.forEach { email ->
        println("'$email' valid: ${validator.isValidEmail(email)}")
    }

    // 3. Password strength
    println("\n--- 3. Password Strength ---")
    val passwords = listOf(
        "weak",
        "Strong1!",
        "StrongPass123!"
    )
    passwords.forEach { pass ->
        println("'$pass' strong: ${validator.isStrongPassword(pass)}")
    }

    // 4. Extract data
    println("\n--- 4. Extract Data from Text ---")
    val sampleText = """
        Contact us at [email protected] or [email protected].
        Visit https://example.com or http://test.org for more info.
        Mention @user1 and @user2 in your posts.
        Use #hashtag1 and #hashtag2.
    """.trimIndent()

    val searcher = RegexSearcher()
    println("Emails found:")
    searcher.extractEmails(sampleText).forEach { println("  - $it") }

    println("\nURLs found:")
    searcher.extractURLs(sampleText).forEach { println("  - $it") }

    println("\nMentions found:")
    searcher.extractMentions(sampleText).forEach { println("  - $it") }

    println("\nHashtags found:")
    searcher.extractHashtags(sampleText).forEach { println("  - $it") }

    // 5. Text processing
    println("\n--- 5. Text Processing ---")
    val processor = RegexTextProcessor()
    val messyText = "  This    has   extra   spaces  "
    println("Original: '$messyText'")
    println("Normalized: '${processor.normalizeWhitespace(messyText)}'")

    val htmlText = "<p>Hello <b>World</b></p>"
    println("\nHTML: '$htmlText'")
    println("Removed tags: '${processor.removeHTMLTags(htmlText)}'")

    // 6. Masking
    println("\n--- 6. Data Masking ---")
    val email = "[email protected]"
    println("Original: $email")
    println("Masked: ${processor.maskEmail(email)}")

    val card = "1234 5678 9012 3456"
    println("\nCard: $card")
    println("Masked: ${processor.maskCreditCard(card)}")

    // 7. Advanced patterns
    println("\n--- 7. Advanced Patterns ---")
    val advanced = AdvancedPatternMatcher()

    val repeatedText = "This is is a test test of repeated words"
    println("\nText: '$repeatedText'")
    println("Repeated words:")
    advanced.findRepeatedWords(repeatedText).forEach { (word, count) ->
        println("  - '$word' appears $count times consecutively")
    }

    val palindromeText = "Did you see that racecar level mom?"
    println("\nText: '$palindromeText'")
    println("Palindromes found:")
    advanced.findPalindromes(palindromeText).forEach { println("  - $it") }

    println("\n=== All Regular Expression Examples Completed ===")
}