【问题标题】:Inserting strings at changing positions在变化的位置插入字符串
【发布时间】:2016-04-21 01:20:35
【问题描述】:

我跌倒了,我需要一些帮助。

我需要一种基于索引将子字符串插入更长字符串的方法。 不幸的是,随后的插入使原始索引过时(随着字符串变长),我想知道是否有办法解决这个问题?

This is a hyperlink. And so is this.
          ^-------^            ^--^
         10      19           31  35

第一次插入后,第二个索引会改变:

This is a <a href="#">hyperlink. And so is this.
                                           ^--^
                              31          43  47

有人知道实现我想要的方法/库/算法吗?

这样我就可以神奇地插入,但仍然使用原始索引?

【问题讨论】:

  • old index + inserted section length?
  • @Ian 当然,但我有一个索引和子字符串列表,我该如何在伪代码中做到这一点?每个后续索引都需要更新吗?
  • 从头开始替换
  • @JamesThorpe 嗯...你能发布一些关于你的方法的代码吗?
  • @silkfire 呃,不。我不是代码编写服务。你说你“有一个索引和子字符串列表”,大概你正在迭代它 - 只是向后做。

标签: c# string token


【解决方案1】:

我将概括一下。如果你有一个更长的字符串,只需有一个变量,你会随着每次添加的长度而增加。

所以如果你有这个列表

Idices  - Substrings

1  -  "test" 
10 -  "link"
30 - "another test"

以及变量int indexSum = 0,您在每次插入时递增,例如indexSum += substring.Length; 当您想在索引 10 处插入时,您实际上将插入 10 + indexSum 并且 indexSum 将是 indexSum+4

【讨论】:

  • 您还需要注意只增加插入文本之后的索引。如果索引在插入之前,则索引不会改变。
【解决方案2】:

从最高索引替换为最低索引。只有你要替换的索引之后发生变化,所以如果你从最高的开始,你可以保持相同的索引,所有的东西都会被正确替换,不需要调整。如果您只需要一次通过字符串,这是一个非常简单的解决方案:)

This is a hyperlink. And so is this.
          ^-------^            ^--^
         10      19           31  35

This is a hyperlink. And so is My new hyperlink this.
          ^-------^            ^-------------------^
         10      19           31

This is a another hyperlink. And so is My new hyperlink this.
          ^---------------^            ^-------------------^
         10

【讨论】:

    【解决方案3】:

    编辑:Luaan 的回答更有意义。除非您不能以这种方式排序列表,否则请使用他们的答案。

    在一些结构化的英语中:

    Order the substrings to be inserted by the index
    Insert the first substring
    Increment the index of the rest of the substrings by the length of the first substring
    Repeat
    

    或者您可以保留一个变量来记录所有插入文本的长度。这可能会更有效。

    只需将此变量添加到要插入的子字符串的索引中,然后将变量增加子字符串的长度

    【讨论】:

      【解决方案4】:

      有多种方法可以解决这个问题;什么对你有用,首先取决于你在做什么。例如:

      • 如果您通过某种搜索来查找这些索引,那么解决此问题的一个好方法是迭代地执行搜索。不是在任何替换之前立即查找所有索引,而是搜索第一个,执行替换,然后从那里搜索下一个项目。例如,一个简单的String.IndexOf() 就很适合。

      • 如果您要进行实际替换,您可以将处理这些索引的工作留给正则表达式库。因此,您只需执行 RegExp.Replace() 即可自动运行,而无需您对索引进行任何操作。如果您需要执行更复杂的替换,您还可以使用match evaluator delegate 为每个替换运行代码。同样,在这种情况下您不需要手动调整字符串。

      • 如果您只有需要替换的索引,一个常见的例子是 Twitter API 返回的 URL 实体(因为 Twitter 会告诉您链接在哪里,以及您需要在哪里进行替换) , 然后你可以通过拆分字符串来做到这一点。基本上,如果您有替换范围[10, 19] 和[31, 35],那么您可以将字符串分成三部分:[0, 9]、[19, 30] 和[35, …]。然后您只需将替换项放在它们之间并将它们连接在一起即可获得结果字符串。

      【讨论】:

        猜你喜欢
        • 2012-12-01
        • 2017-05-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        • 2010-11-22
        • 1970-01-01
        相关资源
        最近更新 更多