KotlinRegex命名组支持

wz8daaqr  于 2023-01-26  发布在  Kotlin
关注(0)|答案(5)|浏览(139)

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

yv5phkfx

yv5phkfx1#

根据this discussion
Kotlin 1.1. https://youtrack.jetbrains.com/issue/KT-12753将支持此功能
Kotlin 1.1 EAP已经可以尝试。

"""(\w+?)(?<num>\d+)""".toRegex().matchEntire("area51")!!.groups["num"]!!.value

你得去一趟一趟。

wztqucjr

wztqucjr2#

从Kotlin1.0开始,Regex类不提供访问MatchGroupCollection中匹配的命名组的方法,因为标准库只能使用JDK6中可用的regex API,JDK6也不支持命名组。
如果目标是JDK8,可以使用java.util.regex.Patternjava.util.regex.Matcher类,java.util.regex.Matcher类提供group方法获取命名捕获组匹配结果。

kq0g1dla

kq0g1dla3#

从Kotlin1.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是一个很好的解释

gk7wooem

gk7wooem4#

以上答案对我不起作用,但起作用的是使用以下方法:

val pattern = Pattern.compile("""(\w+?)(?<num>\d+)""")
val matcher = pattern.matcher("area51")

while (matcher.find()) {
    val result = matcher.group("num")
}
fumotvh3

fumotvh35#

Kotlin

fun regex(regex: Regex, input: String, group: String): String {
    return regex
        .matchEntire(input)!!
        .groups[group]!!
        .value
}

@Test
fun regex() {
    // given
    val expected = "s3://asdf/qwer"

    val pattern = "[\\s\\S]*Location\\s+(?<s3>[\\w/:_-]+)[\\s\\S]*"
    val input = """
        ...
        ...
        Location    s3://asdf/qwer
        Serde Library    org.apache.hadoop.hive.ql.io.orc.OrcSerde
        InputFormat    org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
        OutputFormat    org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
    """.trimIndent()
    val group = "s3"

    // when
    val actual = CommonUtil.regex(pattern.toRegex(), input, group)

    // then
    assertEquals(expected, actual)
}

相关问题