如何替换正则表达式中除最后一个重复字母之外的所有字母

本文关键字:最后一个 何替换 替换 正则表达式 | 更新日期: 2023-09-27 18:34:05

这是我想要在正则表达式中执行的转换的表格:

From       To
================
CAT        CAT
EGG        EGG
A          A
Z          Z
AA         ZA
BB         ZB
ZZ         ZZ
AAA        ZZA
HHHHH      ZZZZH

换句话说,如果字符串是重复 2 次或更多次的相同字母,我想用 Z 替换除最后一个字母之外的所有字母。

我在这里精神上被封锁了。这就是我到目前为止想出的,它不起作用:

FIND:     ^(?<='1*?)([A-Z])(?='1+)$
REPLACE:  Z

我不确定是否可以在捕获组之前使用反向引用,但无论哪种方式,用.替换第一个'1都无济于事。

我正在使用 C#,所以我正在寻找 .NET 样式的正则表达式。我当然可以通过正常的字符串操作来做到这一点,但我有特定于业务案例的需求来使用正则表达式。

如何替换正则表达式中除最后一个重复字母之外的所有字母

有人订购了什么黑魔法吗?

FIND:    'G([A-Z])(?='1)
REPLACE: Z

'G'A一样将每个匹配项锚定到字符串的开头,或者锚定到上一个匹配结束的位置。 换句话说,正则表达式中的([A-Z])总是尝试匹配下一个字符,并且由于前瞻 - (?='1) - 你知道下一个字符与您刚刚替换的字符相同。

此外,您自我回答中的正则表达式对我不起作用。 +没有做任何有用的事情(毕竟你只关心下一个角色),但它也不会伤害任何东西。 让它为我工作的是删除$

更新:我没有抓住字符串必须是两个或更多相同字符的要求,没有别的。 这意味着+$都是必需的。 当我在的时候,我将解决一个额外的要求,即字符串XXXXXIIIII应该单独保留。 瞧!

'G(?!'A(?:XXX?|III?)$)([A-Z])(?='1+$)

可以先匹配所需的字符,然后执行前瞻和后瞻,包括这些锚点而不是主表达式中的锚点,因为您希望表达式逐个字符匹配。

([A-Z])(?<=^'1*)(?='1+$)

但是,它的性能不会很高,因为它为每个字符行走整个字符串。

您最好使用正则表达式来检测字符串是否由相同的字符组成,然后用正常的字符串替换方法用 Z 替换除最后一个字符之外的所有字符,或者创建一个长度为原始字符减去 1 的 Z 字符串,并附加原始字符的第一个字符, 例如。

可能像匹配然后替换之类的东西可能会起作用。

string [] Samps = {  "CAT",  "EGG",  "A",  "Z",  "AA",  "BB",  "ZZ",  "AAA",  "HHHHH" };
foreach (var item in Samps)
{
    string line = item + "'t't";
    line += Regex.Match(item, @"^([A-Z])'1+$").Success ?
            Regex.Replace(item, @".(?!$)", "Z") :
            item;
    Console.WriteLine(line);
}

输出

CAT             CAT
EGG             EGG
A               A
Z               Z
AA              ZA
BB              ZB
ZZ              ZZ
AAA             ZZA
HHHHH           ZZZZH