2015-02-23 129 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"];