【问题标题】:Replace the nth index of a character替换字符的第 n 个索引
【发布时间】:2018-10-17 19:23:03
【问题描述】:

如何仅使用正则表达式替换字符的第 n 个索引。

string input = "%fdfdfdfdfdfdfdfdfdfdfdffd";
string result = Regex.Replace(input, "^%", "");

上面的代码,用空字符串替换了第一个字符,但是,我想指定一个索引:比如第n个索引,所以那个字符被替换为一个空字符串。

谁能帮帮我。

【问题讨论】:

标签: c# regex


【解决方案1】:

可以创建一个正则表达式模式来捕获替换字符之前和之后的所有字符,然后将整个字符串替换为由新字符分隔的两个捕获。例如:

Regex.Replace("abcdefgh", @"^(.{4}).(.*)$", @"$1E$2") // returns "abcdEfgh"

然后您可以创建一个方法来替换特定索引处的字符:

string ReplaceCharacter(string text, int index, char value)
    => Regex.Replace(text, $@"^(.{{{index}}}).(.*)$", $@"${{1}}{value}${{2}}");

// Usage:
ReplaceCharacter("Foo-bar", 3, 'l') // returns "Foolbar"

【讨论】:

    【解决方案2】:

    正如 Johan Wentholt 在 cmets 中所说,您可以完美地使用 Regex.Replace 从行首匹配多个字符,并将其替换为比完整匹配部分少一个字符的捕获组:

    String result = Regex.Replace(input, "^(.{" + index + "}).", "$1");
    

    这匹配“index 乘以任何字符,后跟另一个字符,位于字符串的开头”,但仅将其替换为“index 乘以任何字符”,而没有最后一个字符,因为最后一个点是在捕获组之外。

    如果您想替换为空字符串以外的其他内容,只需将其连接到 "$1" 替换字符串的末尾即可。虽然为了安全起见,您应该将其替换为 "${1}" 以避免如果您在其后面添加的部分以数字开头时出现问题,因为这会更改捕获组编号。

    【讨论】:

      【解决方案3】:

      仅使用正则表达式可能无法实现您想要做的事情。这有点像作弊:

      var input = "%fdfd678dfdfdfdfdfdfdfdffd";
      
      var result = Regex.Replace(input, "^.{7}", input.Substring(0,6));
      
      Console.WriteLine($"result = {result}");
      

      【讨论】:

      • 如果您使用捕获组,只需使用正则表达式即可。
      • 是的,但是您必须以某种方式“连接”匹配的组。我不会将其称为“仅限正则表达式”的解决方案。
      • 一点也不。在正则表达式中放置一个捕获组,该捕获组比整个匹配的表达式少一个字符,并将其替换为捕获组的内容,就完成了。
      猜你喜欢
      • 2011-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 1970-01-01
      • 2017-12-01
      • 2012-07-19
      • 1970-01-01
      相关资源
      最近更新 更多