API 21(android 5)及以下版本的正则表达式模式错误

时间:2019-02-25 07:18:02

标签: java android regex kotlin android-5.0-lollipop

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())

此模式在21以上的所有API上都可以正常工作。

1 个答案:

答案 0 :(得分:2)

似乎早期版本不支持命名组。根据此来源,named groups were introduced in 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 demoregex demo

如果您需要检查整个字符串是否匹配,请使用matches

Regex(urlRegex).matches(sampleUrl)

请参见another Kotlin demo

请注意,要定义正则表达式,您需要使用Regex类构造函数。