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 回答

弒天下
TA貢獻1818條經驗 獲得超8個贊
似乎早期版本不支持命名組。根據這個來源,命名組是在 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 演示和正則表達式演示。
如果您需要檢查整個字符串匹配,請使用matches:
Regex(urlRegex).matches(sampleUrl)
查看另一個 Kotlin 演示。
請注意,要定義正則表達式,您需要使用Regex類構造函數。
添加回答
舉報
0/150
提交
取消