Ошибка шаблона регулярных выражений в API 21 (Android 5) и ниже - PullRequest
0 голосов
/ 25 февраля 2019

Android 5 и ниже, получая ошибку из моего шаблона регулярных выражений во время выполнения:

java.util.regex.PatternSyntaxException: Syntax error in regexp pattern near index 4:
(?<g1>(http|ftp)(s)?://)?(?<g2>[\w-:@])+(?<TLD>\.[\w\-]+)+(:\d+)?((|\?)([\w\-._~:/?#\[\]@!$&'()*+,;=.%])*)*

Вот пример кода:

val urlRegex = "(?<g1>(http|ftp)(s)?://)?(?<g2>[\\w-:@])+(?<TLD>\\.[\\w\\-]+)+(:\\d+)?((|\\?)([\\w\\-._~:/?#\\[\\]@!$&'()*+,;=.%])*)*"
val sampleUrl = "https://www.google.com"
val urlMatchers = Pattern.compile(urlRegex).matcher(sampleUrl)
assert(urlMatchers.find())

Этот шаблон действительно отлично работает на всех API выше 21.

1 Ответ

0 голосов
/ 25 февраля 2019

Кажется, более ранние версии не поддерживают именованные группы.Согласно этому источнику, именованные группы были введены в Kotlin 1.2 .Удалите их, если вам не нужны эти подспаривания, и используйте для проверки только регулярное выражение.

Ваше регулярное выражение очень неэффективно, поскольку содержит много вложенных количественных групп.См. «Более чистую» версию этого ниже.

Кроме того, кажется, вы хотите проверить, есть ли совпадение регулярных выражений в вашей входной строке.Используйте Regex#containsMatchIn():

val urlRegex = "(?:(?:http|ftp)s?://)?[\\w:@.-]+\\.[\\w-]+(?::\\d+)?\\??[\\w.~:/?#\\[\\]@!$&'()*+,;=.%-]*"
val sampleUrl = "https://www.google.com"
val urlMatchers = Regex(urlRegex).containsMatchIn(sampleUrl)
println(urlMatchers) // => true

См. Демо Kotlin и демо regex .

Если вам нужночтобы проверить соответствие всей строки, используйте matches:

Regex(urlRegex).matches(sampleUrl)

См. еще одну демонстрацию Kotlin .

Обратите внимание, что для определения регулярного выражения вам необходимо использовать Regex конструктор класса.

...