2015-02-23 126 views
1

我有一個字符串,我想找到每個用戶在該字符串中選擇單詞的位置。例如,如果用戶選擇「我的」,我希望每次在字符串中找到「我的」。目前我正在使用:搜索字符串重複實例的一個字

var range = stringContent?.rangeOfString("my") 
println(range?.location) 

不幸的是,這隻給了我第一個「我的」字符串的位置。我如何找到所有「我的」的位置?谷歌沒有太多的幫助 - 所有的建議和例子都找到了這個詞的第一個例子。我想要所有的實例。

感謝您的幫助!

回答

0

好了,現在在斯威夫特...

let string: NSString = "my blah my blah my" 

let searchString = "my" 

var range: NSRange = string.rangeOfString(searchString) 

while range.location != NSNotFound { 
    println(range) 

    let searchRange = NSMakeRange(range.location + range.length, string.length - range.length - range.location) 

    range = string.rangeOfString(searchString, options: nil, range: searchRange) 
} 

這版畫...

(0,2) 
(8,2) 
(16,2) 

哪些是字符串 「我」 的正確位置。

1

這基本上是@Fogmeister建議的,但使用NSString的內置方法enumerateSubstringsInRange(_:options:usingBlock:)。它會爲你帶來一系列「我的」出現的範圍。

var rangesOfMatches = [NSRange]() 

someString.enumerateSubstringsInRange(NSMakeRange(0, someString.length), options: .ByWords) { (substring, substringRange, _, _) in 
    if substring == "my" { 
     rangesOfMatches.append(substringRange) 
    } 
} 
+1

是的。我也在想這個。儘管有一些搜索詞出現,但對於長字符串可能效率很低。 – Fogmeister 2015-02-23 23:35:10

+0

這似乎工作得很好 - 我會嘗試將其實施到我的代碼中。我可以問什麼(substring,substringRange,_,_)是什麼? – CodeIt 2015-02-24 19:36:10

0

您可以使用NSScanner掃描到一個字符串,記錄了索引,掃描過去的字符串,沖洗和重複:

let scanner = NSScanner(string: "This is a test.") 

while !scanner.atEnd { 
    scanner.scanUpToString("is", intoString: nil) 
    println(scanner.scanLocation) // will print 2 the first time around, and 5 the second 
    scanner.scanString("is", intoString: nil) 
} 

這應該給你的每個實例的起始索引你正在尋找的字符串。

但是,如果它的使用方式與此類似,它也會記錄字符串的結束索引。放棄這一點。

0

如果你想使用純斯威夫特字符串和範圍,你需要做的這一個循環:

var stringContent = "amydamydamydamydamydamydamydamydamydamydamydamyd" 

var index = stringContent.startIndex 

while let range = stringContent.rangeOfString("my", options: NSStringCompareOptions.allZeros, range: Range(start: index, end: stringContent.endIndex)) { 
     index = range.endIndex.successor() 
     println(index) 

} 
0

爲雨燕另一種解決方案,我覺得很繁瑣與串& String.Index斯威夫特! !

let myString = "gffffsfjjjjjjfsfffffffsjjjjfs" 
let subString = "fs" 

let strLen = countElements(myString) 

//init search range : the whole string 
var searchRange = Range(start:advance(myString.startIndex,0), end: advance(myString.startIndex, strLen)) 

var foundRange = myString.rangeOfString(subString, options: NSStringCompareOptions.CaseInsensitiveSearch, range: searchRange, locale: nil) 

var i: Int = 0; 
while ((foundRange?.isEmpty) != nil) { 
    i++ 

    //recaculate searchRange 
    searchRange = Range(start:advance(foundRange!.endIndex ,0), end: advance(myString.startIndex, strLen)) 

    foundRange = myString.rangeOfString(subString, options: NSStringCompareOptions.CaseInsensitiveSearch, range: searchRange, locale: nil) 
} 

NSLog("Count = \(i)") 

//擴展版本

extension String { 
    func countOccurent(_subString : String) -> Int { 
     let strLen = countElements(self) 

     //init search range : the whole string 
     var searchRange = Range(start:advance(self.startIndex,0), end: advance(self.startIndex, strLen)) 

     var foundRange = self.rangeOfString(_subString, options: NSStringCompareOptions.CaseInsensitiveSearch, range: searchRange, locale: nil) 

     var i: Int = 0; 
     while ((foundRange?.isEmpty) != nil) { 
      i++ 

      //re-caculate searchRange 
      searchRange = Range(start:advance(foundRange!.endIndex ,0), end: advance(self.startIndex, strLen)) 

      foundRange = self.rangeOfString(_subString, options: NSStringCompareOptions.CaseInsensitiveSearch, range: searchRange, locale: nil) 
     } 

     NSLog("Result = \(i)") 

     return i 
    } 

} 
0

我迅速福缺乏,但這裏的OBJ - C的一個選項。 (我很想看看它是如何轉化爲swift的 - 我無法獲得NSCountedSet的構造函數來獲取陣列..)

NSUInteger count = [[[NSCountedSet alloc] initWithArray: [@"hello world hello again" componentsSeparatedByString: @" "]] countForObject: @"hello"];