Ali*_*eza 1 java regex android 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\-._~:/?#\[\]@!$&'()*+,;=.%])*)*
Run Code Online (Sandbox Code Playgroud)
这是代码示例:
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())
Run Code Online (Sandbox Code Playgroud)
这种模式在 21 以上的所有 API 上都运行得非常好。
似乎早期版本不支持命名组。根据此消息来源,命名组是在 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
Run Code Online (Sandbox Code Playgroud)
如果您需要检查整个字符串匹配,请使用matches:
Regex(urlRegex).matches(sampleUrl)
Run Code Online (Sandbox Code Playgroud)
请注意,要定义正则表达式,您需要使用Regex类构造函数。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |