在变化的位置插入字符串
Inserting strings at changing positions
我迷路了,需要一些帮助。
我需要一种基于索引将子字符串插入较长字符串的方法。
不幸的是,随后的插入会使原始索引过时(随着字符串变长),我想知道是否有办法解决这个问题?
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
有人知道 method/library/algorithm 可以实现我想要的吗?
这样我就可以神奇地插入,但仍然使用 原始索引?
我要概括一下。如果你有一个更长的字符串,只要有一个变量,你随着每次添加的长度而增加。
所以如果你有这个列表
Idices - Substrings
1 - "test"
10 - "link"
30 - "another test"
和变量 int indexSum = 0
,您在每次插入时递增,例如 indexSum += substring.Length;
当您想在索引 10 处插入时,您实际上会插入 10 + indexSum 并且 indexSum 将为 indexSum+4
从最高指数到最低指数替换。只有索引 after 你要替换的东西会改变,所以如果你从最高的开始,你可以保持相同的索引,所有的东西都会被正确替换,不需要调整。如果您只需要通过字符串一次,这是一个非常简单的解决方案:)
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
编辑: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
或者您可以保留一个变量来记录所有插入文本的长度。这可能会更有效率。
只需将此变量添加到要插入的子字符串的索引中,然后将变量增加子字符串的长度
有多种方法可以解决这个问题;什么对你有用有点取决于你一开始在做什么。例如:
如果您进行某种搜索来查找这些索引,那么解决此问题的一个好方法是迭代执行搜索。不是在进行任何替换之前立即找到所有索引,而是先搜索第一个索引,执行替换,然后从那里搜索下一个项目。例如,一个简单的 String.IndexOf()
就可以很好地工作。
如果您要进行实际的替换,您可以将处理这些索引的工作留给正则表达式库。因此,您只需执行 RegExp.Replace()
即可自动运行,而无需对索引执行任何操作。如果您需要执行更复杂的替换,您还可以为每个替换使用一个 match evaluator delegate 到 运行 代码。同样,在这种情况下您不需要手动调整字符串。
如果您只有需要替换的索引,一个常见的例子是 URL 由 Twitter API 返回的实体(因为 Twitter 告诉您在哪里link 是,并且需要替换的地方),那么您可以通过拆分字符串来完成此操作。基本上,如果您有替换范围 [10, 19]
和 [31, 35]
,那么您会将字符串拆分为三个部分:[0, 9]
、[19, 30]
和 [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
有人知道 method/library/algorithm 可以实现我想要的吗?
这样我就可以神奇地插入,但仍然使用 原始索引?
我要概括一下。如果你有一个更长的字符串,只要有一个变量,你随着每次添加的长度而增加。
所以如果你有这个列表
Idices - Substrings
1 - "test"
10 - "link"
30 - "another test"
和变量 int indexSum = 0
,您在每次插入时递增,例如 indexSum += substring.Length;
当您想在索引 10 处插入时,您实际上会插入 10 + indexSum 并且 indexSum 将为 indexSum+4
从最高指数到最低指数替换。只有索引 after 你要替换的东西会改变,所以如果你从最高的开始,你可以保持相同的索引,所有的东西都会被正确替换,不需要调整。如果您只需要通过字符串一次,这是一个非常简单的解决方案:)
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
编辑: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
或者您可以保留一个变量来记录所有插入文本的长度。这可能会更有效率。
只需将此变量添加到要插入的子字符串的索引中,然后将变量增加子字符串的长度
有多种方法可以解决这个问题;什么对你有用有点取决于你一开始在做什么。例如:
如果您进行某种搜索来查找这些索引,那么解决此问题的一个好方法是迭代执行搜索。不是在进行任何替换之前立即找到所有索引,而是先搜索第一个索引,执行替换,然后从那里搜索下一个项目。例如,一个简单的
String.IndexOf()
就可以很好地工作。如果您要进行实际的替换,您可以将处理这些索引的工作留给正则表达式库。因此,您只需执行
RegExp.Replace()
即可自动运行,而无需对索引执行任何操作。如果您需要执行更复杂的替换,您还可以为每个替换使用一个 match evaluator delegate 到 运行 代码。同样,在这种情况下您不需要手动调整字符串。如果您只有需要替换的索引,一个常见的例子是 URL 由 Twitter API 返回的实体(因为 Twitter 告诉您在哪里link 是,并且需要替换的地方),那么您可以通过拆分字符串来完成此操作。基本上,如果您有替换范围
[10, 19]
和[31, 35]
,那么您会将字符串拆分为三个部分:[0, 9]
、[19, 30]
和[35, …]
。然后你只需将你的替换放在它们之间并将它们连接在一起以获得结果字符串。