替换字符的第n个索引

时间:2018-10-17 19:23:04

标签: c# regex

如何仅使用Regex替换字符的第n个索引。

RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 
iPhone RewriteRule .* http://domain-for-redirect.com/ [R]
RewriteEngine on RewriteCond %{HTTP_USER_AGENT} 
iPad RewriteRule .* http://domain-for-redirect.com/ [R]

上面的代码用空字符串替换了第一个字符,但是,我想指定一个索引:像第n个索引一样,以便用空字符串替换字符。

有人可以在这里帮我吗

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

答案 1 :(得分:0)

仅Regex可能无法完成您想做的事情。这有点作弊:

var input = "%fdfd678dfdfdfdfdfdfdfdffd";

var result = Regex.Replace(input, "^.{7}", input.Substring(0,6));

Console.WriteLine($"result = {result}");

答案 2 :(得分:0)

正如约翰·温索尔特(Johan Wentholt)在评论中所说,您可以完美地使用Regex.Replace从行首开始匹配多个字符,并用比完整匹配的字符少一个字符的捕获组替换它: / p>

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

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

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