2016-10-14 12 views
1

Characterが単語境界(Unicode TR#29で定義)であるかどうかを確認するにはどうすればよいですか?文字が単語境界であるかどうかを確認する方法

私は正規表現を使用して解決策を持っていますが、私はそれが醜いと思います。

+2

親愛なる神は、ちょうどそのスペックを見ました。私はこのような単純なサウンドの複雑さがどれほど複雑かは考えていませんでした。 – Alexander

+1

@AlexanderMomchliov:正規表現についてよく知っていれば、簡単に聞こえる '\ b'を思い出すかもしれません。あなたがそれが完全に、そして人間言語アプリケーションのために完全に使用できない方法で定義されていることを理解すれば、良い置換を探し始めると、* complex *のような*複雑な*彼らが動作する仕様とアルゴリズムは、使用されているすべての言語、それ以外の言語でも機能しなければならないという問題があります。私は、テキストでのシンプルな問題はすべてそのようなものだと思います。 – Joey

+0

@ fpg1503:Swift用のICUバインディングがあるか、AppleにコアAPIの一部として似たものがあるかもしれません。私はそれを少し疑うが、そのようなことは標準ライブラリでは実装されない傾向があります。 – Joey

答えて

0

1文字の場合、単語境界かどうかを判断できません。あなたは2つの連続した文字か、むしろ2つの連続する書記素クラスタしか決定できません。

おそらく、このコードはあなたにとって役に立ちます。これは、指定された文字列の単語境界の配列を作成します。それはNSString.enumerateSubstrings(in:options:using:)に基づいています。

あなたは遊び場でそれを実行することができます:

import Foundation 

let str = "The quick brown_fox jumps over/the lazy dog. Flag Emoji ." 

extension String { 

    public var wordBoundaries: [String.Index] { 

     var boundaries: [String.Index] = [] 

     let start = startIndex 
     let end = endIndex 
     boundaries.append(start) 

     enumerateSubstrings(in: start ..< end, options: .byWords) { 
        substring, substringRange, enclosingRange, stop in 

      let lb = substringRange.lowerBound 
      if boundaries.last! != lb { 
       boundaries.append(substringRange.lowerBound) 
      } 
      boundaries.append(substringRange.upperBound) 
     } 
     if boundaries.last! != end { 
      boundaries.append(end) 
     } 

     return boundaries 
    } 
} 


var prevBoundary: String.Index? = nil 
for b in str.wordBoundaries { 
    if let lower = prevBoundary { 
     let s = str[lower ..< b] 
     print(s) 
    } 
    prevBoundary = b 
} 
関連する問題