繁体   English   中英

如何在 lambda 表达式中使用 kotlin 中的替换 function 将字母替换为数字

[英]How do I replace letters with numbers using the replace function in kotlin inside a lambda expression

mood = "leet"
modifier = { message ->
    val regex = """(L|e|t)""".toRegex() 
    //Clueless about what to do after this         
}

到目前为止,这就是我想出的,书 BIG NERD RANCH KOTLIN 第 2 版中的问题说“leet(或 1337):叙述者会用 leetpeak 说话,用看起来相似的数字和符号替换字母。例如,' L'变成'1';'E'变成'3';'T'变成'7'。(提示:看看String的替换function。有一个版本接受lambda作为第二个参数。)

这是他们告诉你看的 function ,特别是这个:

inline fun CharSequence.replace(
    regex: Regex,
    noinline transform: (MatchResult) -> CharSequence
): String

返回一个新字符串,该字符串通过将与给定正则表达式匹配的此字符序列的每个 substring 替换为给定 function 转换的结果而获得,该转换采用MatchResult并返回一个字符串以用作该匹配的替换。

因此,您提供的 lambda 是一个 function ,它接受一个MatchResult并对其进行处理,并返回一个CharSequence (可以是一个长String )。 对于regex进行的每个匹配, replace function 调用 lambda。

你知道你应该做什么了吗? 您在这里有两个部分 - 识别要处理的输入字符串的部分的东西,以及获取这些匹配并将它们更改为其他东西的东西。 结果是进行了这些更改的原始字符串。 所以你需要想出一个可以一起工作的regex和一个transform

没有人(可能)会告诉您答案,因为重点是自己解决问题,但是如果您对正则表达式之类的事情有任何疑问,人们会很乐意为您提供帮助,而且说到:这个网站非常有用(我只是自己用它来检查我知道自己在做什么): https://regex101.com/

这是@cactustictacs 指出的实现:

5 -> {
        mood = "leet"
        val regex: Regex = """[LET]""".toRegex()
        modifier = { message ->
            message.uppercase().replace(regex) { m ->
                when (m.value) {
                    "L" -> "1"
                    "E" -> "3"
                    "T" -> "7"
                    else -> ""
                }
            }
        }
    }

这是另一种几乎相同的方法,但使用regex.replace()进行了微小的更改

5 -> {
        mood = "leet"
        val regex: Regex = """[LET]""".toRegex()
        modifier = { message ->
            regex.replace(message.uppercase()){m ->
                when (m.value) {
                    "L" -> "1"
                    "E" -> "3"
                    "T" -> "7"
                    else -> ""
                }
            }
        }
    }

您可以使用it代替m以使其更加简洁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM