Skip to content

Instantly share code, notes, and snippets.

@KentarouKanno
Last active January 28, 2018 09:13
Show Gist options
  • Save KentarouKanno/b4f836a389b076971857710193b4fb24 to your computer and use it in GitHub Desktop.
Save KentarouKanno/b4f836a389b076971857710193b4fb24 to your computer and use it in GitHub Desktop.
文字列操作

文字列操作

★ 指定文字列を置換する

let str = "あいうeo"
str.stringByReplacingOccurrencesOfString("eo", withString: "えお")
// -> あいうえお

★ 任意の文字列を検索してrangeを取得する

var str = "abcdefghi"

// 任意の文字列ある位置を取得する、取得できない場合はnilを返す
if let range = str.range(of: "cde") {
    
    let low = range.lowerBound
    //=> 2
    let upper = range.upperBound
    //=> 5
    
    let s = str.replacingCharacters(in: range, with: "CDE")
    //=> "abCDEfghi"
}

★ 漢字を仮名に変換する
参考URL: 読み仮名を得る

 import Foundation

func chagedToKana(kanjiText: String) -> String {
    
    let inputText = kanjiText as NSString
    
    let outputText = NSMutableString()
    
    var range: CFRange = CFRangeMake(0, inputText.length)
    let locale: CFLocale = CFLocaleCopyCurrent()
    
    /* トークナイザーを作成 */
    let tokenizer: CFStringTokenizer = CFStringTokenizerCreate(kCFAllocatorDefault,
                                                               inputText as CFString,
                                                               range,
                                                               kCFStringTokenizerUnitWordBoundary,
                                                               locale)
    
    /* 最初の位置に */
    var tokenType: CFStringTokenizerTokenType = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0)
    
    /* 形態素解析 */
    while tokenType.rawValue != 0 {
        range = CFStringTokenizerGetCurrentTokenRange(tokenizer)
        
        /* ローマ字を得る */
        let latin: CFTypeRef = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer, kCFStringTokenizerAttributeLatinTranscription)
        
        let romaji = latin as! NSString
        
        /* 平仮名に変換 */
        let furigana: NSMutableString = romaji.mutableCopy() as! NSMutableString
        CFStringTransform(furigana as CFMutableString, nil, kCFStringTransformLatinHiragana, false)
        
        outputText.append(furigana as String)
        tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)
    }
    return outputText as String
}


// --------- 使い方 ---------

let kana = chagedToKana(kanjiText: "田中一郎")
//=> "たなかいちろう"

★ 漢字をカタカナに変換する  

import Foundation


func chagedToKatakana(kanjiText: String) -> String {
    
    let inputText = kanjiText as NSString
    
    let outputText = NSMutableString()
    
    var range: CFRange = CFRangeMake(0, inputText.length)
    let locale: CFLocale = CFLocaleCopyCurrent()
    
    /* トークナイザーを作成 */
    let tokenizer: CFStringTokenizer = CFStringTokenizerCreate(kCFAllocatorDefault, inputText as CFString, range, kCFStringTokenizerUnitWordBoundary, locale)
    
    
    /* 最初の位置に */
    var tokenType: CFStringTokenizerTokenType = CFStringTokenizerGoToTokenAtIndex(tokenizer, 0)
    
    /* 形態素解析 */
    while tokenType.rawValue != 0 {
        dump(tokenType)
        range = CFStringTokenizerGetCurrentTokenRange(tokenizer)
        
        /* ローマ字を得る */
        let latin: CFTypeRef = CFStringTokenizerCopyCurrentTokenAttribute(tokenizer, kCFStringTokenizerAttributeLatinTranscription)
        
        let romaji = latin as! NSString
        
        /* カタカナに変換 */
        let furigana: NSMutableString = romaji.mutableCopy() as! NSMutableString
        CFStringTransform(furigana as CFMutableString, nil, kCFStringTransformLatinKatakana, false)
        
        outputText.append(furigana as String)
        tokenType = CFStringTokenizerAdvanceToNextToken(tokenizer)
    }
    
    return outputText as String
}

// --------- 使い方 ---------

let katakana = chagedToKatakana(kanjiText: "田中一郎")
//=> "タナカイチロウ"
  • 特定の文字列の中から数字を抽出
let mixedString = "123abc456def"
let splitNumbers = (mixedString.components(separatedBy: NSCharacterSet.decimalDigits.inverted))
let number = splitNumbers.joined()

print(number) // "123456"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment