Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
文字列.hasPrefix() / hasSuffix() / contains()
Swiftの文字列では『hasPrefix()』『hasSuffix()』で前後を確認し、『contains()』で特定の文字列や条件を含むか判定できます。
構文
// 前方一致
文字列.hasPrefix("プレフィックス")
// 後方一致
文字列.hasSuffix("サフィックス")
// 部分一致
文字列.contains("検索文字列")
// 範囲検索
文字列.range(of: "検索文字列")
// 大文字小文字を区別しない検索
文字列.localizedStandardContains("検索文字列")
メソッド一覧
| メソッド | 概要 |
|---|---|
| 文字列.hasPrefix(文字列) | 指定した文字列で始まるかをBoolで返します。 |
| 文字列.hasSuffix(文字列) | 指定した文字列で終わるかをBoolで返します。 |
| 文字列.contains(文字列) | 指定した文字列を含むかをBoolで返します。 |
| 文字列.range(of: 文字列) | 一致する範囲(Range<Index>)を返します。見つからない場合はnilです。 |
| 文字列.range(of: 文字列, options: .caseInsensitive) | 大文字小文字を区別しない範囲検索を行います。 |
| 文字列.localizedStandardContains(文字列) | ロケールを考慮した大文字小文字を無視した部分一致検索を行います。 |
| 文字列.firstRange(of: 正規表現) | 正規表現で最初にマッチする範囲を返します(Swift 5.7以降)。 |
サンプルコード
// hasPrefix と hasSuffix
let filename = "report_2026.pdf"
print(filename.hasPrefix("report")) // true
print(filename.hasSuffix(".pdf")) // true
print(filename.hasSuffix(".txt")) // false
let url = "https://example.com/page"
if url.hasPrefix("https://") {
print("セキュアな接続です")
}
// contains
let message = "Swift は型安全な言語です"
print(message.contains("型安全")) // true
print(message.contains("動的型付け")) // false
// range(of:) で位置を取得
let text = "Hello, World!"
if let range = text.range(of: "World") {
print("見つかりました: \(text[range])")
// 一致した後の文字列を取得
print("残り: \(text[range.upperBound...])")
}
// 大文字小文字を区別しない検索
let html = "<a href='Link'>テキスト</a>"
if html.range(of: "link", options: .caseInsensitive) != nil {
print("linkが含まれています(大文字小文字無視)")
}
// 複数ファイルのフィルタリング例
let files = ["photo.jpg", "doc.pdf", "image.png", "report.pdf", "video.mp4"]
let pdfs = files.filter { $0.hasSuffix(".pdf") }
print(pdfs) // ["doc.pdf", "report.pdf"]
概要
『hasPrefix』『hasSuffix』『contains』はすべてUnicodeを正しく扱い、ロケール非依存な比較を行います。大文字小文字を無視したい場合は『range(of:options:.caseInsensitive)』または『localizedStandardContains』を使います。
『range(of:)』はマッチした位置の『Range<String.Index>』を返します。Swiftの文字列インデックスはInt型ではなく『String.Index』型です。整数で直接アクセスすることはできません。
文字列の置換やトリムについては文字列.replacingOccurrences() / trimmingCharacters()を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。