【发布时间】:2016-09-02 11:44:31
【问题描述】:
Kotlin 是否支持命名的正则表达式组?
命名的正则表达式组如下所示:(?<name>...)
【问题讨论】:
标签: regex kotlin regex-group
Kotlin 是否支持命名的正则表达式组?
命名的正则表达式组如下所示:(?<name>...)
【问题讨论】:
标签: regex kotlin regex-group
从 Kotlin 1.0 开始,Regex 类不提供访问 MatchGroupCollection 中匹配的命名组的方法,因为标准库只能使用 JDK6 中可用的正则表达式 API,它也不支持命名组.
如果您以 JDK8 为目标,您可以使用 java.util.regex.Pattern 和 java.util.regex.Matcher 类。后者提供group方法来获取命名捕获组匹配的结果。
【讨论】:
这将在 Kotlin 1.1 中得到支持。 https://youtrack.jetbrains.com/issue/KT-12753
Kotlin 1.1 EAP 已经可以试用了。
"""(\w+?)(?<num>\d+)""".toRegex().matchEntire("area51")!!.groups["num"]!!.value
你必须usekotlin-stdlib-jre8。
【讨论】:
从 Kotlin 1.4 开始,您需要将 groups 的结果转换为 MatchNamedGroupCollection:
val groups = """(\w+?)(?<num>\d+)""".toRegex().matchEntire("area51")!!.groups as? MatchNamedGroupCollection
if (groups != null) {
println(groups.get("num")?.value)
}
正如@Vadzim 正确注意到的那样,您必须使用kotlin-stdlib-jdk8 而不是kotlin-stdlib:
dependencies {
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}
Here 是一个很好的解释
【讨论】: