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ąć