2017-12-15 7 views
0

内のすべての単語の接頭辞:フィルター配列

var Arr = ["apple", "banana", "orange", "grapes", "yellow banana", "urban"] 

どのように私は私のキーワードの接頭辞を持つ配列内のすべての単語をフィルタリングするのですか? は、今私は、この持っている:

.filter { $0.contains(keyword) } 
.sorted { ($0.hasPrefix(keyword) ? 0 : 1) < ($1.hasPrefix(keyword) ? 0 : 1) } 

をしかし、私はキーワード「禁止」を持っている場合、それは「バナナ」、「黄色バナナ」、および「都市」を返します。 「バナナ」と「黄色いバナナ」を得るためには、配列要素内のすべての単語の接頭辞をフィルタリングするだけでよいです。

+0

あなただけのフィルタ処理したい場合は、()ソートを呼び出すのはなぜ?単純な '.filter {$ 0.hasPrefix(キーワード)}'はどうでしょうか? –

+0

@MartinRありがとうございます。私の場合は、配列や区切り文字などを分割する必要があると思います。 –

答えて

2

をキーワード が単語境界(\bパターン)で発生するかどうかを確認する正規表現です。

let array = ["apple", "banana", "orange", "grapes", "yellow banana", "urban"] 
let keyword = "ban" 

let pattern = "\\b" + NSRegularExpression.escapedPattern(for: keyword) 
let filtered = array.filter { 
    $0.range(of: pattern, options: .regularExpression) != nil 
} 

print(filtered) // ["banana", "yellow banana"] 

そして、大文字と小文字を区別しない検索のための代わりに

options: [.regularExpression, .caseInsensitive] 

使用しています。 スウィフト3+でまた

+0

@DavidDavidoff:上記のコードを 'let keyword =" yellow b "その結果、 ''黄色のバナナ ''という印字をします。あなたはどんな結果を期待していますか? –

+0

はい、申し訳ありませんが、別のコメントに送信することを意味します。 解決策のみが動作し、スペース記号も使用できます。ありがとうございました –

2

あなたが最初enumerateSubstringsメソッドを使用して単語にあなたの文字列を分割する必要がありますし、単語のいずれかがキーワードプレフィックスが含まれている場合、あなたは確認することができます:あなたが使用することができます

extension String { 
    var words: [String] { 
     var words: [String] = [] 
     enumerateSubstrings(in: startIndex..<endIndex, options: .byWords) { word,_,_,_ in 
      guard let word = word else { return } 
      words.append(word) 
     } 
     return words 
    } 
} 

let arr = ["apple", "banana", "orange", "grapes", "yellow banana", "urban"] 
let keyword = "ban" 

let filtered = arr.filter { $0.words.contains(where: {$0.hasPrefix(keyword)}) } 

filtered // ["banana", "yellow banana"] 
0

let array = ["apple", "banana", "orange", "grapes", "yellow banana", "urban"] 
let keyword = "ban" 

let filtered = array.filter { 
    $0.components(separatedBy: " ").first { $0.hasPrefix(keyword) } != nil 
} 
print(filtered) // ["banana", "yellow banana"] 
関連する問題