regex - 访问比赛结果的更好方法?

标签 regex kotlin

我的要求是转换一些短信ID。输入是

a.messageid=X0001E
b.messageid=Y0001E

任务是将其转变为

a.messageid=Z00001E
b.messageid=Z00002E

换句话说:获取每行的第一部分(例如:a.),并附加一个稍微不同的 id。

我当前的解决方案:

val matcherForIds = Regex("(.*)\\.messageid=(X|Y)\\d{4,6}E")  
var idCounter = 5

fun transformIds(line: String): String {
    val result = matcherForIds.matchEntire(line) ?: return line
    return "${result.groupValues.get(1)}.messageid=Z%05dE".format(messageCounter++)
}

有效,但发现我如何第一次匹配“${result.groupValues.get(1)}的方式不是很优雅。

有没有更好读/更简洁的方式来访问第一个匹配项?

最佳答案

您无需单独的函数即可获得结果:

val line = s.replace("""^(.*\.messageid=)[XY]\d{4,6}E$""".toRegex()) { 
    "${it.groupValues[1]}Z%05dE".format(messageCounter++) 
}

但是,由于您需要将 messageCounter 格式化为结果,因此您不能只使用字符串替换模式,也不能删除 ${it .groupValues[1]}.

另外,请注意:

  • 您可以通过三引号字符串文字来消除双反斜杠
  • 如果您将该部分捕获到第 1 组中,则无需将 .messageid= 添加到替换中(请参阅 (.*\.messageid=))
  • 无需捕获 XY,因为稍后不会使用它们,因此可以替换 (X|Y)具有更高效的字符类[XY]
  • ^$ 确保模式应该匹配整个字符串,否则将不匹配,并且字符串将按原样返回,不做任何修改.

请参阅Kotlin demo online .

关于regex - 访问比赛结果的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52387095/

相关文章:

java - 测试字符串中的数字字符

javascript - 修改正则表达式以允许负数

android - Anko CardView 半径不起作用

javascript - 无法找到与正则表达式模式匹配的字符串

regex - Twig:Twig 中带有正则表达式的 Slug?

html - Perl 打印从数组到 html <td> 的正则表达式匹配项

java - 这个语法在 Kotlin 中意味着什么?

android - Kotlin Coroutines - 从 Coroutine 返回一个值而不阻塞主线程 Android

android - 如何从 Flutter PlatformView(Android kotlin 端)返回我的原生 android Activity

android - 在实现 Room Database 时,我们为什么可以创建一个 Interface 的对象?