2016-12-22 77 views
1

我有這個NS搜索表達式。 searchString傳遞一個字符串,我想在baseString中搜索並突出顯示。然而,目前如果我搜索單詞'h i de'的單詞'I'和'i'例如顯示爲突出顯示。如何在Swift字符串中僅搜索整個單詞

我已經看到,我可以使用\b來搜索整個單詞,但我無法看到我將它添加到表達式中的位置。這樣只有整個單詞被突出顯示。

另一個例子是,如果我的即basestring包含「他的故事是歷史」,我用搜索字符串這麼搜索「他」,它會突出保守黨。

let regex = try! NSRegularExpression(pattern: searchString as! String,options: .caseInsensitive) 

for match in regex.matches(in: baseString!, options: NSRegularExpression.MatchingOptions(), range: NSRange(location: 0, length: (baseString?.characters.count)!)) as [NSTextCheckingResult] { 
    attributed.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellow, range: match.range) 
} 

回答

2

更新

我覺得比我以前的答案一個更好的解決辦法,所以我更新它。對於喜歡這樣的人來說,最初的答案會隨之而來。

"(?<=[^A-Za-z0-9]|^)[A-Za-z0-9]+(?=[^A-Za-z0-9]|$)" 

打破這種表達,(?<=[^A-Za-z0-9]|^)檢查我要匹配的詞之前的任何非字母數字或線^的開始。 [A-Za-z0-9]+?匹配任何字母數字字符,並且至少需要一個匹配+(?=[^A-Za-z0-9]|$)將在單詞I匹配後檢查另一個非字母數字或行結尾$。因此這個表達式將匹配任何字母數字。爲了排除數字只匹配字母簡單地從表達中刪除0-9

"(?<=[^A-Za-z]|^)[A-Za-z]+(?=[^A-Za-z]|$)" 

對於使用這個詞代替中心匹配表達式匹配,如:

"(?<=[^A-Za-z]|^)\(searchString)(?=[^A-Za-z]|$)" 

老回答

我嘗試過使用它之前,它發現每個字符串由空格分隔。應該做的事,你需要

"\\s[a-zA-Z1-9]*\\s" 

變化[A-ZA-Z1-9] *以符合您所搜索的內容,你的情況符合原來的搜索字符串轉換成它像

let regex = try! NSRegularExpression(pattern: "\\s\(searchString)\\s" ,options: .caseInsensitive)  

由於一個附加的答案,\\s將包括單詞前後的空白。我添加了一個檢查,以排除空格,如果它變得更加有用,該模式是這樣的:

"(?<=\\s)[A-Za-z0-9]*(?=\\s)" 

同樣,更換[A-Za-z0-9]*其搜索你需要的搜索字符串的所有單詞。

注意,(?<=\\s)檢查單詞前面的空白但不包括它,(?=\\s)檢查後面的空白,也沒有包括它。由於沒有額外的空格,因此與大多數場景相比,這在我上面的原始答案中會更好。

+0

謝謝@ ben-ong,但是如何將它添加到我的代碼上面? – flakedev

+0

順便說一下,你可以參考[NSRegularExpression](https://developer.apple.com/reference/foundation/nsregularexpression)來了解更多有關在swift中使用它的信息。這與例如雙反斜槓等通用方式有點不同。 \ b匹配退格 –

3

您可以輕鬆地從你的searchString創建一個正則表達式模式:

let baseString = "His story is history" 
let searchString = "his" //This needs to be a single word 
let attributed = NSMutableAttributedString(string: baseString) 

//Create a regex pattern matching with word boundaries 
let searchPattern = "\\b"+NSRegularExpression.escapedPattern(for: searchString)+"\\b" 

let regex = try! NSRegularExpression(pattern: searchPattern, options: .caseInsensitive) 

for match in regex.matches(in: baseString, range: NSRange(0..<baseString.utf16.count)) { 
    attributed.addAttribute(NSBackgroundColorAttributeName, value: UIColor.yellow, range: match.range) 
} 

一些評論:

  • 假設baseStringsearchString在代碼非可選String以上,如果不要在搜索前儘快製作它們。

  • 空OptionSet由[]表示,因此options: NSRegularExpression.MatchingOptions()在你的代碼可以簡化爲option: [],並且它是matches方法,你有沒有需要指定的options:參數的默認值。

  • NSRegularExpression接收和返回基於String的UTF-16表示形式的範圍。您不應該使用characters.count來製造NSRange,而應該使用utf16.count

  • matches(in:range:)的退貨類型被宣告爲[NSTextCheckingResult],因此您無需再投一次。

相關問題