Kotlin是否支持命名正则表达式组?
命名的正则表达式组长这个样子:(?<name>...)
Kotlin 1.1 EAP已经可以尝试了。这将在Kotlin 1.1中得到支持。https://youtrack.jetbrains.com/issue/KT-12753
"""(\w+?)(?<num>\d+)""".toRegex().matchEntire("area51")!!.groups["num"]!!.value
你需要使用 kotlin-stdlib-jre8。
Regex
类目前没有提供访问 MatchGroupCollection
中匹配命名组的方法。java.util.regex.Pattern
和 java.util.regex.Matcher
类。后者提供了 group
方法来获取命名捕获组匹配结果。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")
}
fun main() {
val regex = """\b(?<city>[A-Za-z\s]+),\s(?<state>[A-Z]{2}):\s(?<areaCode>[0-9]{3})\b""".toRegex()
val input = "Coordinates: Austin, TX: 123"
val match = regex.find(input)!!
println(match.groups["city"]?.value)
// Austin
println(match.groups["state"]?.value)
// TX
println(match.groups["areaCode"]?.value)
// 123
}
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)
}