Kotlin Regex 命名组支持

Kotlin Regex named groups support

Kotlin 是否支持命名正则表达式组?

命名的正则表达式组如下所示:(?<name>...)

从 Kotlin 1.0 开始,Regex class 不提供访问 MatchGroupCollection 中匹配的命名组的方法,因为标准库只能使用正则表达式 api在 JDK6 中可用,它也不支持命名组。

如果您以 JDK8 为目标,则可以使用 java.util.regex.Patternjava.util.regex.Matcher classes。后者提供group方法获取named-capturing group match的结果

根据this discussion

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")
}