1

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

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 风格的正则表达式。我当然可以通过正常的字符串操作来做到这一点,但我有一个特定于业务案例的需要使用正则表达式。

4

3 回答 3

3

有人订购了一些黑魔法吗?

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

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

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

更新:我没有注意到字符串必须是两个或多个相同字符而没有别的要求。这意味着 the+和 the$都是必需的。在此期间,我将解决字符串XX、、XXX和应该单独放置II的附加要求。III瞧!

\G(?!\A(?:XXX?|III?)$)([A-Z])(?=\1+$)
于 2012-05-14T23:40:16.363 回答
2

有可能,只需先匹配您想要的字符,然后进行前瞻和后瞻,包括那些锚点而不是主表达式中的锚点,因为您希望表达式逐个字符匹配。

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

但是,它不会非常高效,因为它会遍历每个字符的整个字符串。

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

于 2012-05-14T23:05:40.043 回答
0

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

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
于 2012-05-15T01:30:12.093 回答