目次
はじめに
C++で、「ファイル名が _backup
で終わっているか」「URLが https://
で始まっているか」といった、文字列の前方一致または後方一致を判定したい場面は頻繁にあります。
従来は、.substr()
や .compare()
といったメンバ関数を組み合わせて、少し冗長なコードを書く必要がありました。
C++20では、この目的のための非常に直感的で便利なメンバ関数、.starts_with()
と .ends_with()
が std::string
と std::string_view
に追加されました。
【前提】C++20とは?
C++20は、2020年に正式化されたC++言語のメジャーアップデート版です。この記事で紹介する機能はC++20で導入されたため、利用するにはC++20に対応したコンパイラが必要です。
starts_with
/ ends_with
を使ったサンプルコード
このコードは、与えられたファイル名の文字列が、特定の接頭辞および接尾辞で始まっているか、終わっているかを判定します。
完成コード
#include <iostream>
#include <string>
using namespace std;
int main() {
string filename = "report_2025_final.docx";
string prefix = "report";
string suffix = ".docx";
// 1. starts_with(): 前方一致の判定
if (filename.starts_with(prefix)) {
cout << "ファイル名「" << filename << "」は、「" << prefix << "」で始まります。" << endl;
} else {
cout << "ファイル名「" << filename << "」は、「" << prefix << "」で始まりません。" << endl;
}
// 2. ends_with(): 後方一致の判定
if (filename.ends_with(suffix)) {
cout << "ファイル名「" << filename << "」は、「" << suffix << "」で終わります。" << endl;
} else {
cout << "ファイル名「" << filename << "」は、「" << suffix << "」で終わりません。" << endl;
}
// 文字リテラルや単一の文字も渡せる
if (filename.starts_with('r')) {
cout << "ファイル名は 'r' で始まります。" << endl;
}
return 0;
}
コードの解説
.starts_with(prefix)
- 機能: 文字列オブジェクトが、引数
prefix
で指定された文字列で始まる場合にtrue
を、そうでない場合にfalse
を返します。 - 引数:
std::string
,std::string_view
, C言語スタイルの文字列リテラル ("..."
)、単一の文字 ('...'
) を渡すことができます。
.ends_with(suffix)
- 機能: 文字列オブジェクトが、引数
suffix
で指定された文字列で終わる場合にtrue
を、そうでない場合にfalse
を返します。 - 引数:
starts_with
と同様に、様々な種類の文字列や文字を渡すことができます。
まとめ
今回は、C++20で導入された、文字列の前方一致・後方一致を判定する .starts_with()
と .ends_with()
を解説しました。
.starts_with(接頭辞)
: 文字列が指定した接頭辞で始まるか判定する。.ends_with(接尾辞)
: 文字列が指定した接尾辞で終わるか判定する。
これらのメンバ関数を使うことで、従来よりもはるかにコードが簡潔になり、「何をしているか」という意図も明確になります。ファイルパスの解析や、特定のフォーマットを持つデータの検証など、様々な場面で活用できる非常に便利な機能です。