Skip to main content
 首页 » 编程设计

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

2024年02月02日25tuyile006

这是我想在 Regex 中进行的转换的表格:

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

请您参考如下方法:

有人订购了一些吗 dark magic ?

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

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

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

更新:我没有理解字符串必须是两个或更多相同字符而不能是其他 的要求。这意味着 + 和 $ 都是必需的。当我在这里时,我将解决字符串 XX、XXX、II 和 III 的附加要求> 应该单独留下。瞧!

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