为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯709654 2022-07-06 19:03:22
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类构造函数。


查看完整回答
反对 回复 2022-07-06
  • 1 回答
  • 0 关注
  • 209 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信