gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:48:04 24 4
gpt4 key购买 nike

我的要求是转换一些文本消息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++)
}

但是,由于需要将 format messageCounter到结果中,因此不能仅使用字符串替换模式,也不能摆脱 ${it.groupValues[1]}

另外,请注意:
  • 您可以通过用三引号引起来的字符串文字
  • 来消除双反斜杠
  • 如果将零件捕获到组1中,则无需在替换中添加.messageid=(请参见(.*\.messageid=))
  • 无需捕获XY,因为以后不再使用它们,因此,可以用更高效的字符类(X|Y)代替[XY]
  • ^$确保模式应与整个字符串匹配,否则将不匹配,并且将按原样返回字符串,而无需进行任何修改。

  • 参见 Kotlin demo online

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

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com