Witam,
Mam problem z regexem w Kotlinie (Android Studio)
W regexie mam wpisane nazwy grup i to ładnie działa na stronie do sprawdzania regexu.
Niestety w Kotlinie już tak pięknie nie jest, ponieważ tych grup nie umie odczytać.
Oto kod

val gs1Pattern = "(((?<gtinAI>01|02)(?<gtinValue>\\d{14}))?((?<batchAI>10)(?<batchValue>[a-zA-Z0-9]{1,20})(\u001D|\\\$)?)?(((?<expirationAI>15|)17)(?<expirationValue>\\d{6}))?((?<itemCountAI>30|37)(?<itemCountValue>\\d{1,8})(\u001D|\\\$)?)?((?<additionalIdAI>240)(?<additionalIdValue>[A-Za-z0-9]{1,30})(\u001D|\\\$)?)?((?<manufactureAI>11)(?<manufactureDate>\\d{6}))?)".toRegex()

@Parcelize
data class Gs1Code(
    val productCode: String? = null,
    val batch: String? = null,
    val expirationDate: LocalDate? = null,
    val manufactureDate: LocalDate? = null,
    val itemNumber: Double? = null
) : Parcelable

fun String.toGs1CodeOrNull(): Gs1Code? {
    if (length == 0) return null

    if (!this.startsWith("01", true) && !this.startsWith("02", true) &&
        !this.startsWith("17", true) && !this.startsWith("10", true) &&
        !this.startsWith("30", true) && !this.startsWith("11", true)
    )
        return null

    val matches = gs1Pattern.matchEntire(this.trim())?.groups  //Tutaj matchEntire jest null

    return Gs1Code(
        productCode = matches?.get("gtinValue")?.value,
        batch = matches?.get("batchValue")?.value,
        expirationDate = matches?.get("expirationValue")?.value?.removeSuffix("00")?.toLocalDateOrNull(),
        manufactureDate = matches?.get("manufactureDate")?.value?.removeSuffix("00")?.toLocalDateOrNull(),
        itemNumber = matches?.get("itemCountValue")?.value?.toDoubleOrNull()
    )
}

Mam podobny kod z regexem i on działa prawidłowo.

val udiPattern = "([+](\\w{4}(?<gtinValue>[0-9A-Z]{1,19}))?([\\/]?(((([\$]|[\$][+])|(([\$]{2}|[\$]{2}[+])(((?<dateExpMMYY>[0-1]\\d{3})|(?<dateExpMMDDYY>[2]([0-1]\\d{6}))|[3](?<dateExpYYMMDD>\\d{6})|[4](?<dateExpYYMMDDHH>\\d{8})|[5](?<dateExpYYJJJ>\\d{5})|[6](?<dateExpYYJJJHH>\\d{7})|[7]))))(?<batchAI>[0-9A-Z]{1,18})))?((([\\/]16D)(?<dateManYYYYMMDD>\\d{8}))?(([\\/]14D)(?<dateExpYYYYMMDD>\\d{8}))?((?<serialAi>[\\/][S])(?<serialNumber>[0-9A-Z]{1,18}))?)?))".toRegex()

Po paru dniach udało mi się rozwiązać powyższy problem
Działa dla SDK API >= 26

    val matcher = gs1Pattern.toPattern().matcher(this)

    var product: String? = null
    var batch: String? = null
    var expire: String? = null
    var manufacture: String? = null
    var item: String? = null

    while (matcher.find()){
        matcher.group("gtinValue")?.let { product = it }
        matcher.group("batchValue")?.let { batch = it }
        matcher.group("expirationValue")?.let { expire = it }
        matcher.group("manufactureDate")?.let { manufacture = it }
        matcher.group("itemCountValue")?.let { item = it }
    }
   
    return Gs1Code(
            productCode = product,
            batch = batch,
            expirationDate = expire?.removeSuffix("00")?.toLocalDateOrNull(gs1DateFormatter),
            manufactureDate = manufacture?.removeSuffix("00")?.toLocalDateOrNull(gs1DateFormatter),
            itemNumber = item?.toDoubleOrNull()    )

Może nie jest to zbyt eleganckie, ale działa jak należy.
Temat można zamknąć