android 使用正则表达式屏蔽电子邮件

dkqlctbz  于 2023-03-21  发布在  Android
关注(0)|答案(1)|浏览(187)

我必须屏蔽我的电子邮件,也就是说,用星号代替几个字母。

这是我的要求

1.输入-asxyz@ifyourock.com
输出-**xyz@ify**********
1.输入-xyz@gmail.com
输出-xyz@gma******
1.输入-asxyz.abc@gmail.com
输出-******abc@gma******
1.输入-car@domain.com
输出-car@dom*******
1.输入-as@domain.com
输出-as@dom*******
下面是我的正则表达式,我尝试:

fun maskEmail(email: String): String {
    val regex = "(.{3})(.*)(@.{3})(.*)".toRegex()
    return regex.replace(email) { matchResult ->
        val (prefix, middle, atSymbol, domain) = matchResult.destructured
        "${prefix}${"*".repeat(middle.length)}${atSymbol}${"*".repeat(domain.length - 2)}"
    }
}

但它给出了错误的输出:
输入-asxyz@ifyourock.com
输出-as***@ify**********
我必须在@前后保留**〈=3**个字母
我需要帮助来实现上述产出。

3duebb1j

3duebb1j1#

我不太了解Kotlin,但在一个在线IDE中玩了一会儿,我想到了:

fun main() {    
    var lst = arrayOf("asxyz@ifyourock.com", "xyz@gmail.com", "asxyz.abc@gmail.com", "car@domain.com", "as@domain.com")    
    lst.map{println(it.replace("[^@](?!.{0,2}@|(?<=@...)|(?<=@..)|(?<=@.))".toRegex(), "*"))}
}

试试这个online

编辑:

我试图找到一种方法使你的搜索模式更加动态。上面的方法要求你让每个长度选项在模式中成为它们各自的选择。所以为了避免这种情况,我拼凑起来:

fun main() {
    var lst = arrayOf("asxyz@ifyourock.com", "xyz@gmail.com", "asxyz.abc@gmail.com", "car@domain.com", "as@domain.com")
    lst.map{
        val m = ".{0,3}@.{0,3}".toRegex().find(it)!!
        println("*".repeat(it.length).replaceRange(m.range.first , m.range.last, m.value))
    }
}

试试这个online
或者,不使用regex:

fun main() {
    var lst = arrayOf("asxyz@ifyourock.com", "xyz@gmail.com", "asxyz.abc@gmail.com", "car@domain.com", "as@domain.com")
    lst.map {
        val i = it.indexOf("@")
        println(((0..it.length-1).map{x -> if (x<i-3||x>i+3) "*" else it[x]}).joinToString(""))
    }
}

试试这个online
所有选项打印:

**xyz@ify**********
xyz@gma******
******abc@gma******
car@dom*******
as@dom*******

相关问题