这是我想在 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+$)
