Regex匹配两个或多个字符,并将每个字符替换为X

本文关键字:字符 替换 Regex 两个 | 更新日期: 2023-09-27 17:50:31

我想将两个或多个字符[fli]的任意组合更改为x,单独的f, li应保持不变,但任何组合都应替换。

换句话说:匹配模式[fli]{2,}并将其替换为x 's(与匹配的长度相同)

示例输入1:

office/offices/muffled/stiffly/shuffled/different/difficult/office/officers no change: igloo/visiting/unwieldly

示例输入2:

oflice/oflices/muflled/stiflly/shuflled/diflerent/diflicult/ofiice/oflicers no change: igloo/visiting/unwieldly

样本输出(1 &2):

oxxxce/oxxxces/muxxxed/stxxxxy/shuxxxed/dxxxerent/dxxxxcult/oxxxce/oxxxcers no change: igloo/visiting/unwieldly

我正在使用c#,但我更喜欢把它作为一个普通的正则表达式。

Regex匹配两个或多个字符,并将每个字符替换为X

如果您阅读文档,您将发现Regex.Replace()。特别是,重载Regex.Replace(string,MatchEvaluator)

string source      = @"
  Now flip, flop and fly,
  I don't care if I die,
  Now flip, flop and fly,
  I don't care if I die.
  Don't ever leave me,
  Don't ever say goodbye.
  " ;
Regex  rx          = new Regex( @"[fli]{2,}" ) ;
string replacement = rx.Replace(source, m => new string('x',m.Length)) ;

以上屠夫大乔特纳最优秀的歌词和生产的预期

Now xxxp, xxop and xxy,
I don't care xx I die,
Now xxxp, xxop and xxy,
I don't care xx I die.
Don't ever leave me,
Don't ever say goodbye.

通过向前看和向后看找到了解决方案。

string output = Regex.Replace(input, "([fli](?=[fli])|(?<=[fli])[fli])", "x");

它完成了工作。然而,当我对它进行测试时,它在notepad++中不起作用(因为它的搜索框一次只替换一个)。是否有更简单、更优雅或更好的解决方案?