替换字符串中的一个字符而不是两个字符

dha*_*eme 2 c# regex

我想用C#替换字符串中单个出现但不是两个字符串.

例如,我想用&空字符串替换,但不是在发生时&&.另一个例子,a&b&&cab&&c在更换后成为.

如果我使用正则表达式&[^&],它也会匹配后面的字符&,我不想替换它.

我找到的另一个解决方案是迭代字符串字符.

你知道一个更清洁的解决方案吗?

Wik*_*żew 5

要仅匹配一个&(不在 之前或之后&),请使用环视 (?<!&)(?!&)

(?<!&)&(?!&)
Run Code Online (Sandbox Code Playgroud)

正则表达式演示

您尝试使用仍然匹配字符的否定字符类,并且您需要使用前瞻/后视来检查某些字符的缺失/存在,而不消耗它。

请参阅正则表达式.info

如果你想匹配一些后面没有其他东西的东西,负前瞻是必不可少的。在解释字符类时,本教程解释了为什么不能使用否定字符类来匹配q后面跟有u. 排除模式提供了解决方案:q(?!u)

Lookbehind 具有相同的效果,但向后工作。它告诉正则表达式引擎在字符串中暂时后退,以检查lookbehind 中的文本是否可以在那里匹配。(?<!a)b匹配"b"前面没有a 的 a "a",使用负向后视。它不匹配cab,但匹配b(并且仅b)在床上或债务。


Guf*_*ffa 5

您可以匹配两者&&&(或任意数量的重复),只用空字符串替换单个字符串:

str = Regex.Replace(str, "&+", m => m.Value.Length == 1 ? "" : m.Value);
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是必要的复杂因素.仅使用正则表达式即可实现结果而无需添加LINQ.我也喜欢LINQ,但这里完全是多余的. (3认同)
  • @stribizhev LINQ使用lambda表达式,但lambda表达式不是LINQ. (2认同)