使用正则表达式替换任意数量的字符

时间:2016-05-19 20:44:22

标签: c# regex string

我当前的任务是获取一个字符串并根据一系列规则对其进行转换。我目前遇到以下问题:

当给出"XYYX"形式的字符串时,我需要将其更改为"XZZX"形式的字符串。我必须保持X(我可以做到),但我需要更换每个" Y"用" Z"。问题是,我不知道提前有多少" Y" s字符串将包含。每个" X"是一系列角色中的一个,我不得不混淆。

我目前正在用C#写这篇文章。我更倾向于使用正则表达式来进行这种转换,因为我已经被告知最好由负责我的人保留它作为正则表达式。目前,我使用以下内容:

Regex reg = new Regex("([X])Y+([X])");
output = reg.Replace(inputString, "$1Z$2");

如果我正在转换" XYX"到" XZX",但它也将转换" XYYX"到" XZX",它不保留X之间的原始字符数。我还需要确保" XYYXY"转换为" XZZXY"。我意识到这很复杂,因为我试图以一种可能不适合的方式使用正则表达式。

所以,这里有一个问题:是否有办法使用正则表达式来识别位于两个定义明确(但可能不同)的分隔符之间的任意数量的字符,然后仅用相同的字符替换那些字符一个不同的角色?

我见过的大多数其他问题只涉及用一个其他角色替换多个角色,而这并不是我所寻找的。

1 个答案:

答案 0 :(得分:2)

如果您需要完全正则表达式方法:

(X|(?!^)\G)Y(?=Y*X)

并替换为$1Z。请参阅regex demo

<强>解释

  • (X|(?!^)\G) - X或上一次成功比赛结束
  • Y - Y
  • (?=Y*X) - Y后必须有零个或多个X个。

另一种方法:匹配和捕获Y,然后将它们全部替换为Z s:

var s = "XYYXYX";
var res = Regex.Replace(s, @"X(Y+)X",
          m => string.Format("X{0}X",m.Groups[1].Value.Replace("Y", "Z")));
Console.WriteLine(res);

请参阅IDEONE demo