代码之家  ›  专栏  ›  技术社区  ›  Kamil Kiełczewski

将每个捕获的字符替换为*?

  •  2
  • Kamil Kiełczewski  · 技术社区  · 6 年前

    我有电子邮件,想替换第一个字母和@to*之间的每个字符。例子:

    john.smith@gmail.com   ->  j*********@gmail.com
    

    这是我的代码,但它只生成一个星而不是多个星-我坚持这样做:

    let h="john.smith@gmail.com".replace(/(.)(.*)@/,'$1*') 
    
    console.log(h);

    有什么解决办法吗?

    6 回复  |  直到 6 年前
        1
  •  3
  •   Kamil Kiełczewski    6 年前

    全局标志是regex中缺少的内容。

    我有一个一次性的Regex来做这个工作:

    "john.smith@gmail.com".replace(/(?!^)(?=.+@)./g,'*')
    
    • 负向前看以排除第一个字符。
    • 对于@char前面的所有字符,请提前查看。
    • 替换所有捕获的全局标志。

    let h = "john.smith@gmail.com".replace(/(?!^)(?=.+@)./g,'*');
    
    console.log(h);
        2
  •  5
  •   trincot Jakube    6 年前

    可以使用的回调参数 replace :

    let h = "john.smith@gmail.com".replace(/(.)(.*)@/, (_, first, rest) =>
        first + "*".repeat(rest.length) + "@"
    ); 
    
    console.log(h);
        3
  •  2
  •   Kamil Kiełczewski    6 年前

    只是写作:

    let e = Array.from("john.smith@gmail.com").reduce((arr, char, index) => arr.concat(arr.includes('@') || char === '@' ? char : index === 0 ? char : '*'), []).join('');
    
    console.log(e)
        4
  •  2
  •   Kamil Kiełczewski    6 年前

    您的regex将匹配整个部分,并替换为一个星。相反,您希望regex能够匹配您希望单独匹配的每个字符。这将起作用:

    let h="john.smith@gmail.com".replace(/(?<=^.+)(?<!@.*)[^@]/g,'*') 
        
    console.log(h);

    要分解regex:

    (?<=^.+) 将使用正的查找方式匹配字符串的开头、第一个字符以及其后的任意数量的字符。这个概念将用于匹配字符串,但不会包含在结果匹配中。

    (?<!@.*) 是一个否定的查找,以确保在@符号后不匹配任何内容。

    [^@] 匹配任何不是@的字符。

    g 最后意味着全局性,这使得它匹配任意次数而不是只匹配一次。

        5
  •  2
  •   antonku    6 年前

    你可以通过 replacement function 在里面 String.prototype.replace ,例如:

    const result = 'john.smith@gmail.com'.replace(
        /^(.)(.*)(@.+)$/,
        (match, ...groups) => groups[0] + '*'.repeat(groups[1].length) + groups[2]
    );
         
    console.log(result);
        6
  •  1
  •   Wiktor Stribiżew    6 年前

    一个简单的regex替换可以做到:

    let h="john.smith@gmail.com".replace(/(?!^).(?=.*@)/g, '*') 
    console.log(h);

    细节

    • (?!^) -不是字符串的开头
    • . -任何字符,除了换行符字符
    • (?=.*@) -在右边,必须有0+个字符,而不是换行字符,然后是 @ .

    online regex demo .