如何替换正则表达式中除最后一个重复字母之外的所有字母
本文关键字:最后一个 何替换 替换 正则表达式 | 更新日期: 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)
- 你知道下一个字符与您刚刚替换的字符相同。
此外,您自我回答中的正则表达式对我不起作用。 +
没有做任何有用的事情(毕竟你只关心下一个角色),但它也不会伤害任何东西。 让它为我工作的是删除$
。
更新:我没有抓住字符串必须是两个或更多相同字符的要求,没有别的。 这意味着+
和$
都是必需的。 当我在的时候,我将解决一个额外的要求,即字符串XX
、XXX
、II
和III
应该单独保留。 瞧!
'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