Swift 文字列操作まとめ集(String)
こんにちはしまーです。今回は、実際に実務で多様している文字列操作(最新版)をまとめてみました。
作業効率アップにつながればと思いますので一度よんでみることをお勧めします。
Swift Stringは、Unicodeに対応しており、多数のメソッドとプロパティを提供しているため文字列操作が非常に便利です。
目次
- 1. 宣言
- 2. 確認環境
- 3. 操作
- 3.1. 文字列の長さ
- 3.2. 文字列の結合
- 3.3. 文字列の追加
- 3.4. 文字列の比較
- 3.4.1. 先頭文字列を比較
- 3.4.2. 語尾文字列を比較
- 3.5. 文字列の検索
- 3.5.1. 指定文字列検索
- 3.5.2. 先頭から指定文字の位置を取得
- 3.5.3. 語尾から特定文字の位置を取得
- 3.6. 分割
- 3.6.1. 文字列を文字に分割
- 3.6.2. 文字列を特定の文字区切りで分割
- 3.6.2.1. case 1 カンマ(,)で分割
- 3.6.2.2. case 2 空白(スペース)で分割
- 3.6.2.3. case 3 空白(スペース)で分割2
- 3.6.2.4. 文字列を特定の文字列区切りで分割
- 3.7. 変換
- 3.7.1. IntからStringへの変換
- 3.7.2. StringからInt型への変換
- 3.8. 置換
- 3.8.1. 英語大文字から小文字
- 3.8.2. 英語小文字から大文字
- 3.8.3. ひらがな→カタカナ
- 3.8.4. カタカナ→ひらがな
- 3.8.5. 指定文字列を置換
- 3.9. 切取り(部分取得・部分削除)
- 3.9.1. 指定文字列以外を取得/指定文字列を削除
- 3.9.2. 前後の空白(スペース)と改行文字削除 / 前後の空白(スペース)と改行文字以外を取得
- 3.9.3. 先頭からn番目までの文字列取得/先頭からn番目以降の文字を削除
- 3.9.4. 語尾からn番目の文字以前を削除 / 語尾からn文字を取得
- 3.9.5. 先頭からn番目の文字まで削除 / 先頭からn番目以降の文字列を取得
- 3.9.5.1. case1
- 3.9.5.2. case 2
- 3.9.5.3. case3
- 3.9.6. 語尾からn番目の文字まで削除 / 語尾からn番目より前の文字列を取得
- 3.9.6.1. case1
- 3.9.6.2. case2
- 3.9.7. m番目からn番目以外の文字削除 / m番目からn番目の文字列を取出し
- 3.10. 文字列補間
- 3.10.1. ゼロパディング(Zero Padding)
- 3.10.1.1. 整数部の先頭を0埋め
- 3.10.1.2. 小数点以下の語尾を0埋め
- 3.11. 改行
- 3.12. Range操作
- 3.12.1. Rangeで指定した文字を取得
- 3.12.2. Rangeで指定した文字を削除
- 3.12.3. Rangeで指定した文字を置換
- 3.13. 文字配列操作
- 3.13.1. 文字列抽出
- 4. 最後に
宣言
Swiftでは、Stringはダブルクォーテーションで囲まれた文字列リテラルで宣言されます。リテラルとはソースコード内に直接かかれた文字とか数字を指す。
let greeting: String = "Hello, world!"
確認環境
Swift 5.7.2
Xcode 14.2
操作
Swift Stringは、文字列を操作するための多数のメソッドとプロパティを提供しています。
以下はいくつかの例になります。
文字列の長さ
let str = "Count"
print(str.count) // 5
文字列の結合
let firstName = "ichirou"
let lastName = "Shimmer"
let fullName = firstName + " " + lastName
print(fullName) // "ichirou Shimmer"
文字列の追加
var name = "ichirou"
name.append(" Shimmer")
print(name) // ichirou Shimmer
文字列の比較
case1.
let str = "帽子"
let hat = "帽子"
let grove = "手袋"
if str == hat {
print("同じ")
} else {
print("違う")
}
// 同じ
if str == grove {
print("同じ")
} else {
print("違う")
}
// 違う
case2
enum MotionState: String{
case front
case back
case right
case left
}
let nowState = "front"
if nowState == MotionState.front.rawValue {
print("nowStateは前進") // nowStateは前進
} else if nowState == MotionState.back.rawValue {
print("nowStateは後退")
}
先頭文字列を比較
let str = "しまーぶろぐ"
print(str.hasPrefix("しまー")) // true
print(str.hasPrefix("まー")) // false
語尾文字列を比較
let message = "The password must be at least 8 characters long"
let hasPassword = message.contains("password")
print(hasPassword) // true
print(message.contains("This")) // false
文字列の検索
指定文字列検索
let message = "The password must be at least 8 characters long"
let hasPassword = message.contains("password")
print(hasPassword) // true
print(messsage.contains("This")) // false
先頭から指定文字の位置を取得
let str = "隣の客はよく柿食う客だ"
if let index = str.firstIndex(of: "客")?.utf16Offset(in: str){
print(index) // 2
}
語尾から特定文字の位置を取得
let str = "隣の客はよく柿食う客だ"
if let index = str.lastIndex(of: "客")?.utf16Offset(in: str){
print(index) // 9
}
分割
文字列を文字に分割
let str = "さらだでげんき"
let charArray = Array(str)
print(charArray) // ["さ","ら","だ","で","げ","ん","き"]
文字列を特定の文字区切りで分割
case 1 カンマ(,)で分割
let str = "さらだ,で,げんき"
let array = str.split(separator: ",")
print(charArray) // ["さらだ","で","げんき"]
case 2 空白(スペース)で分割
let sentence = "The quick brown fox jumps over the lazy dog"
let words = sentence.split(separator: " ")
print(words) // ["The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog"]
case 3 空白(スペース)で分割2
// 空白(スペース)で分割
let str = "さらだ で げんき"
var array = str.components(separatedBy: CharacterSet(charactersIn: " "))
print(array) // ["さらだ", "で", "げんき"]
array = str.components(separatedBy: " ")
print(array) // ["さらだ", "で", "げんき"]
文字列を特定の文字列区切りで分割
static public func check17() {
let str = "さらだ,で,げんき"
let array = str.split(separator: ",で,")
print(array) // ["さらだ", "げんき"]
}
変換
IntからStringへの変換
let num = 10
print("case1 : " + String(num)) // case1 : 10
print("case2 : " + num.description) // case2 : 10
StringからInt型への変換
let str = "10"
let num = Int(str)!
print(num) // 10
置換
英語大文字から小文字
let str = "FIGHT!!花子"
print(str.lowercased()) // fight!!花子
英語小文字から大文字
let str = "fight!!太郎"
print(str.uppercased()) // FIGHT!!太郎
ひらがな→カタカナ
let str = "ひらがな"
let result = str .applyingTransform(.hiraganaToKatakana,revers: false)!
print(result) // ヒラガナ
カタカナ→ひらがな
let str = "カタカナー"
let result = str.applyingTransform(.hiraganaToKatakana,revers: true)!
print(result) // かたかなあ
注意)調音符号もヒラガナに変わる
指定文字列を置換
let str = "にんじん”
let changeStr= str.replacingOccurrences(of: "じ", with: "げ")
print(changeStr) // にんげん
切取り(部分取得・部分削除)
指定文字列以外を取得/指定文字列を削除
let str = "さらだでげんき”
let changeStr = str.replacingOccurrences(of:"で",with:"")
print(changeStr) // さらだげんき
前後の空白(スペース)と改行文字削除 / 前後の空白(スペース)と改行文字以外を取得
// 前後の空白(スペース)を削除
var str = " さらだでげんき "
var changeStr = str.trimmingCharacters(in: .whitespaces)
print(changeStr) // さらだでげんき
str = "\n\nさらだでげんき\n\n"
changeStr = str.trimmingCharacters(in: .newlines)
print(changeStr) // さらだでげんき
str = " \n\nさらだでげんき\n\n "
changeStr = str.trimmingCharacters(in: .whitespacesAndNewlines)
print(changeStr) // さらだでげんき
先頭からn番目までの文字列取得/先頭からn番目以降の文字を削除
let str = "しまーぶろぐ"
print(str.prefix(1)) // し
語尾からn番目の文字以前を削除 / 語尾からn文字を取得
let str = "しまーぶろぐ"
print(str.suffix(1)) // ぐ
先頭からn番目の文字まで削除 / 先頭からn番目以降の文字列を取得
case1
let str = "しまーぶろぐ"
print(str.suffix(str.count - 2)) // ーぶろぐ
case 2
var str = "しまーぶろぐ"
let index = 3
str.removeFirst(index)
print(str) // ぶろぐ
case3
let str = "しまーぶろぐ"
print(str.dropFirst(2)) // ーぶろぐ
print(str.dropFirst(3)) // ぶろぐ
語尾からn番目の文字まで削除 / 語尾からn番目より前の文字列を取得
case1
let str = "しまーぶろぐ"
print(str.prefix(str.count - 2)) // しまーぶ
case2
let str = "しまーぶろぐ"
print(str.dropLast(2)) // しまーぶ
print(str.dropLast(3)) // しまー
m番目からn番目以外の文字削除 / m番目からn番目の文字列を取出し
// 文字列の1~2文字目を取得
let str = "しまーぶろぐ”
let changeStr = String(str.map{$0}[1...2])
print(changeStr) // まー
文字列補間
ゼロパディング(Zero Padding)
整数部の先頭を0埋め
let num = 123
let str = String(format: "%05d", num)
print(str) // 00123
小数点以下の語尾を0埋め
let num = 123.1
let str = String(format: "%0.5f", num)
print(str) // 123.10000
改行
let str = "・第一章\n 其の壱"
print(str)
/*
・第一章
其の壱
*/
Range操作
Rangeで指定した文字を取得
var sentence= "南極にホッキョクグマは居る?"
if let range = sentence.range(of: "ホッキョク") {
print(sentence[range]) // ホッキョク
}
Rangeで指定した文字を削除
var sentence= "南極にホッキョクグマは居る?"
if let range = sentence.range(of: "ホッキョク") {
sentence.removeSubrange(range)
print(sentece) // 南極にグマは居る?
}
Rangeで指定した文字を置換
var sentence= "南極にホッキョクグマは居る?"
if let range = sentence.range(of: "ホッキョク") {
sentence.replaceSubrange(range, with:"ナンキョク")
print(sentece) // 南極にナンキョクグマは居る?
}
文字配列操作
文字列抽出
// 指定文字数の文字列を配列より抽出
let fruits = [ "リンゴ", "桃", "パイナップル" , "いちご", "メロン"]
let threeString = fluets.filter{ $0.count == 3 }
print(threeStrng) // ["リンゴ", "いちご", "メロン"]
最初に条件一致
let fruits = [ "リンゴ", "桃", "パイナップル" , "いちご", "メロン"]
let firstThreeString = fruits.first{ $0.count == 3 }!
print(firstThreeString) // リンゴ
最後に
最後までお読みいただきありがとうございました。
今後も気になる構文を紹介していきたいと思いますので是非よろしくお願いいたします。ご意見などありましたらメッセージ頂けますと幸いです。