在几个索引处拆分字符串 - > [串]?

时间:2015-05-19 16:06:42

标签: regex string swift

我需要找到一种方法将某些字符序列的字符串拆分成字符串数组但是我当前实现的问题是如果字符串中出现两个或更多的拆分,它将覆盖前一个。

考虑在String no = intent.getStringExtra("no"); String name = intent.getStringExtra("name"); st ...

分割以下字符串
ck

使用regexp匹配我得到两个范围匹配,但是如果我尝试在循环中将这些组合到一个数组中,那么第二个匹配将覆盖第一个...

stockwell

最适合这种情况的是String扩展方法,它可以将字符串拆分为多个索引的stockwell: (0,2) --> st --> _st_ockwell stockwell: (3,2) --> ck --> sto_ck_well ,但我还没有成功提出一个。

有人可以在这里给我一些帮助吗?

3 个答案:

答案 0 :(得分:1)

你可以使用lookahead和lookbehind匹配位置:

(?=st)|(?<=st)|(?=ck)|(?<=ck)

并替换为_

请参阅DEMO

答案 1 :(得分:1)

这个怎么样:

extension String {

  func multiSplit(inds: [String.Index]) -> [String] {

    if let loc = inds.last {

      return self[self.startIndex..<loc].multiSplit(Array(dropLast(inds))) + [self[loc..<self.endIndex]]

    } else {

      return [self]

    }
  }
}

let string = "abcdef"

let inds = [
  string.startIndex.successor().successor(),
  string.endIndex.predecessor().predecessor()
]

string.multiSplit(inds) // ["ab", "cd", "ef"]

你给它的指数必须是为了工作。

它是一个递归函数 - 它获取它给出的索引数组中的最后一个索引(inds),并在该索引处拆分字符串。该拆分的前半部分以递归方式给出,并删除了索引数组的最后一个元素。 &#34;如果让&#34;如果索引数组为空,则失败,因此它只返回没有任何拆分的字符串,但是返回一个数组。

在这个例子中,它首先在它给出的最后一个索引处进行分割,得到两个字符串:&#34; abcd&#34;和&#34; ef&#34;。然后,该函数使用&#34; abcd&#34;和不带最后一个元素的索引数组(dropLast())调用自身。在这个功能中,它会拆分&#34; abcd&#34;进入&#34; ab&#34;和&#34; cd&#34;,并在&#34; ab&#34;上再次召唤自己。但是,因为它将一个空数组传递给该函数,所以inds.last将失败,并且它不会拆分任何东西,只返回[&#34; ab&#34;](返回的行[self] )。这取决于上面的功能 - 将其拆分(&#34; cd&#34;)附加到其上,然后返回[&#34; ab&#34;,&#34; cd&#34;]。最后,这将转到上面的函数,它附加了它的分割,它返回答案:[&#34; ab,&#34; cd&#34;,&#34; ef&#34;]。

这一切都只是正常的Swift,但没有进口或任何东西。

如果你不按顺序处理索引,你可以对它们进行排序:

let string = "abcdef"

let inds = [
  string.endIndex.predecessor().predecessor(),
  string.startIndex.successor().successor()
]

string.multiSplit(sorted(inds)) // ["ab", "cd", "ef"]

另外,如果要从函数中删除空字符串:

extension String {

  func multiSplit(inds: [String.Index]) -> [String] {

    if let loc = inds.last {

    return (
      self[self.startIndex..<loc]
      .multiSplit(Array(dropLast(inds)))
      + [self[loc..<self.endIndex]]
      ).filter{!$0.isEmpty}

    } else {

      return [self]

    }
  }
}

答案 2 :(得分:1)

另一种方法,这取决于确保您的分隔符不会相互重叠或相互包含。

import Foundation

let initial = "stockwell"
let firstSeparator = "st"
let secondSeparator = "ck"
var separated = [String]()
let firstSplit = initial.componentsSeparatedByString(firstSeparator)
for next in [firstSeparator].join(firstSplit.map{[$0]}) {
  let secondSplit = next.componentsSeparatedByString(secondSeparator)
  separated += [secondSeparator].join(secondSplit.map{[$0]})
}
separated // => ["", "st", "o", "ck", "well"]

它的工作原理是使用第一个分隔符将字符串分隔成一个数组,将分隔符插入到元素之间的数组中,然后使用下一个分隔符对新数组中的每个元素执行相同的操作。