Kotlin Regex 命名组支持
Kotlin Regex named groups support
Kotlin 是否支持命名正则表达式组?
命名的正则表达式组如下所示:(?<name>...)
从 Kotlin 1.0 开始,Regex
class 不提供访问 MatchGroupCollection
中匹配的命名组的方法,因为标准库只能使用正则表达式 api在 JDK6 中可用,它也不支持命名组。
如果您以 JDK8 为目标,则可以使用 java.util.regex.Pattern
和 java.util.regex.Matcher
classes。后者提供group
方法获取named-capturing group match的结果
This will be supported in Kotlin 1.1.
https://youtrack.jetbrains.com/issue/KT-12753
Kotlin 1.1 EAP 已经可以试用了。
"""(\w+?)(?<num>\d+)""".toRegex().matchEntire("area51")!!.groups["num"]!!.value
你必须 use kotlin-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"
}
很好解释
以上答案对我没有用,但是有用的是使用以下方法:
val pattern = Pattern.compile("""(\w+?)(?<num>\d+)""")
val matcher = pattern.matcher("area51")
while (matcher.find()) {
val result = matcher.group("num")
}
Kotlin 是否支持命名正则表达式组?
命名的正则表达式组如下所示:(?<name>...)
从 Kotlin 1.0 开始,Regex
class 不提供访问 MatchGroupCollection
中匹配的命名组的方法,因为标准库只能使用正则表达式 api在 JDK6 中可用,它也不支持命名组。
如果您以 JDK8 为目标,则可以使用 java.util.regex.Pattern
和 java.util.regex.Matcher
classes。后者提供group
方法获取named-capturing group match的结果
This will be supported in Kotlin 1.1. https://youtrack.jetbrains.com/issue/KT-12753
Kotlin 1.1 EAP 已经可以试用了。
"""(\w+?)(?<num>\d+)""".toRegex().matchEntire("area51")!!.groups["num"]!!.value
你必须 use kotlin-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"
}
以上答案对我没有用,但是有用的是使用以下方法:
val pattern = Pattern.compile("""(\w+?)(?<num>\d+)""")
val matcher = pattern.matcher("area51")
while (matcher.find()) {
val result = matcher.group("num")
}