我想屏蔽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 循环轻松完成,但我需要在正则表达式中完成。先感谢您。
对于您的问题,您需要匹配电子邮件地址中不是单词中的第一个字符且出现在@
. 您可以通过对断字进行负向后视和对@
符号的正向前瞻来做到这一点:
(?<!\b)\w(?=.*?@)
Run Code Online (Sandbox Code Playgroud)
然后可以将匹配的字符替换为*
.
请注意,我们在 上使用了惰性量词 ( ?
).*
以提高效率。
另请注意@CarySwoveland 指出的,您可以替换(?<!\b)
为\B
ie
\B\w(?=.*?@)
Run Code Online (Sandbox Code Playgroud)
正如@Thefourthbird 所指出的,这可以通过将 替换.*?
为[^\r\n@]*
ie来进一步提高效率
\B\w(?=[^\r\n@]*@)
Run Code Online (Sandbox Code Playgroud)
或者,如果您只匹配单个字符串,只需[^@]*
:
\B\w(?=[^@]*@)
Run Code Online (Sandbox Code Playgroud)