Kotlin / Regex - 用重复字符替换一组模式

Ken*_*thC 3 regex kotlin

我想屏蔽maskEmail函数中传递的电子邮件。我目前面临一个问题,其中当我替换模式的第 2 组和第 4 组时星号*不重复

这是我的代码:

fun maskEmail(email: String): String {
    return email.replace(Regex("(\\w)(\\w*)\\.(\\w)(\\w*)(@.*\\..*)$"), "$1*.$3*$5")
}
Run Code Online (Sandbox Code Playgroud)

这是输入:

tom.cat@email.com
cutie.pie@email.com
captain.america@email.com
Run Code Online (Sandbox Code Playgroud)

这是该代码的当前输出:

t*.c*@email.com
c*.p*@email.com
c*.a*@email.com

Run Code Online (Sandbox Code Playgroud)

预期输出:

t**.c**@email.com
c****.p**@email.com
c******.a******@email.com
Run Code Online (Sandbox Code Playgroud)

编辑:我知道这可以用 for 循环轻松完成,但我需要在正则表达式中完成。先感谢您。

Nic*_*ick 5

对于您的问题,您需要匹配电子邮件地址中不是单词中的第一个字符且出现在@. 您可以通过对断字进行负向后视和对@符号的正向前瞻来做到这一点:

(?<!\b)\w(?=.*?@)
Run Code Online (Sandbox Code Playgroud)

然后可以将匹配的字符替换为*.

请注意,我们在 上使用了惰性量词 ( ?).*以提高效率。

regex101 上的演示

另请注意@CarySwoveland 指出的,您可以替换(?<!\b)\Bie

\B\w(?=.*?@)
Run Code Online (Sandbox Code Playgroud)

regex101 上的演示

正如@Thefourthbird 所指出的,这可以通过将 替换.*?[^\r\n@]*ie来进一步提高效率

\B\w(?=[^\r\n@]*@)
Run Code Online (Sandbox Code Playgroud)

regex101 上的演示

或者,如果您只匹配单个字符串,只需[^@]*

\B\w(?=[^@]*@)
Run Code Online (Sandbox Code Playgroud)

regex101 上的演示

  • 精彩的!我将将此设置为答案,为了将来参考,这就是我们如何将模式集成到 kotlin fun maskEmail(email: String): String { return email.replace(Regex("(?&lt;!\\b)\\w (?=.*@)"), "*") } 谢谢@nick 先生! (2认同)