代码之家  ›  专栏  ›  技术社区  ›  Luis Antoni Del Águila Jacobo

C#等效于此正则表达式模式

  •  2
  • Luis Antoni Del Águila Jacobo  · 技术社区  · 6 年前

    我有一个正则表达式模式: .{2}\@.{2}\K|\..*(*SKIP)(?!)|.(?=.*\.)

    转换以替换匹配项以获取

    trabc@abtrec.com.lo => ***bc@ab*****.com.lo
    
    demomail@demodomain.com => ******il@de*********.com
    

    但当我尝试在C上使用它时,不允许使用\K和(*SKIP)和(*F)。

    此模式的c#版本是什么?或者,您知道一种更简单的方法来屏蔽电子邮件,而不使用不受支持的模式条目吗?

    Demo

    更新:

    (*跳过):如果模式的其余部分不匹配,则此动词会导致匹配在主语的当前起始位置失败

    (*F):在模式中的给定位置强制匹配失败(与(?)

    2 回复  |  直到 6 年前
        1
  •  3
  •   Gurmanjot Singh    6 年前

    尝试此正则表达式:

    \w(?=.{2,}@)|(?<=@[^\.]{2,})\w
    

    Click for Demo

    说明:

    • \w -匹配单词字符
    • (?=.{2,}@) -正向前瞻,查找位置,然后立即出现2次以上的任何字符,后跟 @
    • | -或
    • (?<=@[^\.]{2,}) -正向向后查找,以查找前面紧跟的位置 @ 后跟2个以上的非 .
    • \w -匹配单词字符。

    把每一根火柴换成一根 *

        2
  •  2
  •   Sergey Kalinichenko    6 年前

    使用与一个块中的项目匹配的正则表达式,并应用自定义匹配计算器,可以获得相同的结果:

    var res = Regex.Replace(
        s
    ,   @"^.*(?=.{2}\@.{2})|(?<=.{2}\@.{2}).*(?=.com.*$)"
    ,   match => new string('*', match.ToString().Length)
    );
    

    正则表达式有两部分:

    • 左边的那个 ^.*(?=.{2}\@.{2}) 匹配除最后两个字符外的用户名部分
    • 右边的那个 (?<=.{2}\@.{2}).*(?=.com.*$) 将域的后缀匹配到“.com…”结尾

    Demo.