如何根据索引替换字符串中的文本

时间:2014-12-19 15:45:20

标签: c# string

我有一串来自数据库的文本。我还有一个数据库链接列表,它有一个起始索引和长度与我的字符串相对应。我想将文本中的链接附加到链接

<a href=...

var stringText = "Hello look at http://www.google.com and this hello.co.uk";

这将在数据库中

Link:http://www.google.com
Index:14
Length:21

Link:hello.co.uk
Index:45
Length:11

我最终想要

var stringText = "Hello look at <a href="http://www.google.com">http://www.google.com</a> and this <a href="hello.co.uk">hello.co.uk</a>";

字符串中可能有很多链接,所以我需要一种循环遍历这些链接并根据索引和长度进行替换的方法。我会根据链接(string.replace)循环并替换,但如果有两次相同的链接会导致问题

var stringText = "www.google.com www.google.com www.google.com";

www.google.com将成为一个链接,第二次将链接中的链接...链接。

我显然可以找到第一个索引,但是如果我在那个时候更改它,索引就不再有效了。

有没有简单的方法可以做到这一点,还是我错过了什么?

3 个答案:

答案 0 :(得分:3)

您只需使用String.Remove从源中删除<​​em>主题,然后使用String.Insert插入替换字符串。

正如@hogan在评论中建议的那样,您需要对替换列表进行排序,并以相反的顺序(从最后到第一个)进行替换,以使其有效。

如果您需要在单个字符串中执行多次替换,我建议StringBuilder出于性能原因。

答案 1 :(得分:0)

我会使用正则表达式。看看这个:Regular expression to find URLs within a string

这可能会有所帮助。

答案 2 :(得分:0)

这是没有RemoveInsert或正则表达式的解决方案。只是补充。

string stringText = "Hello look at http://www.google.com and this hello.co.uk!";

var replacements = new [] {
    new { Link = "http://www.google.com", Index = 14, Length = 21 },
    new { Link = "hello.co.uk", Index = 45, Length = 11 } };

string result = "";
for (int i = 0; i <= replacements.Length; i++)
{
    int previousIndex = i == 0 ? 0 : replacements[i - 1].Index + replacements[i - 1].Length;
    int nextIndex = i < replacements.Length ? replacements[i].Index : replacements[i - 1].Index + replacements[i - 1].Length + 1;

    result += stringText.Substring(previousIndex, nextIndex - previousIndex);

    if (i < replacements.Length)
    {
        result += String.Format("<a href=\"{0}\">{1}</a>", replacements[i].Link,
            stringText.Substring(replacements[i].Index, replacements[i].Length));
    }
}