我的要求是转换一些短信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=)
) - 无需捕获
X
或Y
,因为稍后不会使用它们,因此可以替换(X|Y)
具有更高效的字符类[XY]
。 ^
和$
确保模式应该匹配整个字符串,否则将不匹配,并且字符串将按原样返回,不做任何修改.
请参阅Kotlin demo online .
关于regex - 访问比赛结果的更好方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52387095/