用星号或最后两个词替换最后一个词

Replace last word with asterisk, or last two words

我需要隐藏人物的姓氏。对于姓名中包含三个单词的人,只需隐藏最后一个单词,ej:

Laura Torres Bermudez

应该

Laura Torres ********

Maria Fernanda Gonzales Lopez

应该是

Maria Fernanda ******** *****

我认为它们是两个正则表达式,因为根据字数,将应用正则表达式。

我知道 \w+ 用一个星号替换所有单词,使用 (?!\s). 我可以替换空格以外的字符。我希望你能帮助我。谢谢。

这是我的例子: https://regex101.com/r/yW4aZ3/942

试试这个:

(?<=\w+\s+\w+\s+.*)[^\s]

解释:

  • ?<= 是负向后视 - 仅匹配指定模式
  • 前面的匹配项
  • [^\s] / 匹配除白色以外的所有内容space(你使用的 - (?!\s). - 实际上是对前瞻的奇怪使用 - "look to next character, if it is not a whitespate; then match any character")
  • 摘要:替换任何非白色space space 字符前面至少有两个字母序列 (\w) 和 spaces (\s).

请注意,对于名字中只有两个单词的人(这在许多国家/地区很常见),它不会隐藏任何内容。

此外,正则表达式必须稍作修改,以便该测试工具每行匹配一个名称 - 请参阅 https://regex101.com/r/yW4aZ3/943(添加 ^ 以从每行的开头开始匹配,并且 "multi line" 标志已设置)。

不依赖于 ECMAScript 2018 扩展正则表达式功能的 Java脚本解决方案

s = s.replace(/^(\S+\s+\S+)([\s\S]*)/, function([=10=], , ) {return  + .replace(/\S/g, '*');})

详情:

  • ^ - 字符串开头
  • (\S+\s+\S+) - 第 1 组:一个或多个非空白,1 个或多个空白,然后是 1 个或多个非空白
  • ([\s\S]*) - 第 2 组:任意 1 个或多个字符。

替换为第 1 组内容和第 2 组内容,每个非空白字符替换为星号。

Java解法:

s = s.replaceAll("(\G(?!^)\s*|^\S+\s+\S+\s+)\S", "*");

regex demo

详情

  • (\G(?!^)\s*|^\S+\s+\S+\s+) - 第 1 组:然后结束上一场比赛 (\G(?!^)) 和 0 个或多个空格或 (|) 1+ 非空格,1+ 空格又是 1+ 个非空格,字符串开头的 1+ 个空格
  • \S - 非空白字符。

如果这可以在 JavaScript 中完成而无需回调,我想出了

str = str.replace(/^(\w+\W+\w+\W+\b)\w?|(?!^)(\W*)\w/gy, '*');

See this demo at regex101

这个想法可能看起来有点混乱,但它似乎工作正常。它应该在一个或两个单词上失败,但会尽快开始,因为在前两个单词之后出现了一个单词字符。使用 sticky flag y 很重要,它类似于 \G 锚点(在最后一场比赛中继续)但总是必须开始。

为了不添加额外的星号,...\b)\w?... 前两个词之后的部分是必不可少的。 word boundary will force a third word to start but the first capturing group\b 之后关闭,第三个单词的第一个字符将被消耗但不会被捕获以正确匹配星号计数。

交替右侧的第二个捕获组将捕获出现在第三个单词之后的任何单词之间的任何可选非单词字符

var strs = ['Foo', 'Foo Bar B', 'Laura Torres Bermudez', 'Maria Fernanda Gonzales Lopez'];
strs = strs.map(str => str.replace(/^(\w+\W+\w+\W+\b)\w?|(?!^)(\W*)\w/gy, '*'));
console.log(strs);