【C言語入門】文字列内の検索方法まとめ(文字指定、正規表現)

文字列の検索って使ってますか?

ある決められた形式の文字列から指定した文字や文字列が含まれる箇所を探しだし、処理を行いたい場合ってありますよね。

たとえばテキストエディタやhtmlファイル内で指定の文字や文字列を探す場合などです。

この記事では、文字列の検索について

・検索とは
・検索方法について

という基本的な内容から、

・正規表現での検索方法について

など応用的な使い方の内容についても解説していきます。

今回は文字列の検索について、使い方をわかりやすく解説します!

検索とは

文字列の検索とは、ある文字列の中から別のある文字列を検索することです。

ある決められた形式の文字列から指定した文字や文字列が含まれる箇所を探す場合に行います。

検索方法について

文字列内を検索する方法として、指定文字を検索する方法と指定文字列を検索する方法があります。

C言語では指定文字を検索する方法としてstrchr関数が、指定文字列を検索する方法としてstrstr関数が用意されています。

どちらもヘッダーファイル「string.h」をインクルードして使用します。

それぞれの使い方についてみていきましょう。

文字列内の文字を検索する方法について

strchr関数を使用して指定文字を検索します。

strchr関数は第1引数に検索される文字列のアドレスを、第2引数に指定文字を入力します。

ちなみに第2引数の型指定はint型です。

strchr関数は該当文字のアドレスを返します。

第1引数に指定した文字列内に第2引数で指定した文字が含まれない場合はNULLを返します。

それではサンプルコードで確認していきましょう。

実行結果:

このサンプルコードではchar型の文字列「str」内をstrchr関数を使って検索しています。

文字「-」で検索した結果をchar型のポインタ「adr1」に返し、文字「a」で検索した結果を「adr2」に返しています。

文字「-」で検索した場合、「str」内に「-」が含まれるので「-」のアドレスをポインタ「adr1」に返し、「-」から終端文字NULLまで表示しています。

文字「a」で検索した場合、「str」内に「a」が含まれませんのでポインタ「adr2」にはNULLを返しています

文字列内の文字列を検索する方法について

strstr関数を使用して指定文字列を検索します。

strstr関数は第1引数に検索される文字列のアドレスを、第2引数に指定文字列を入力します。

strchr関数は該当文字列の先頭のアドレスを返します。

第1引数に指定した文字列内に第2引数で指定した文字列が含まれない場合はNULLを返します。

それではサンプルコードで確認していきましょう。

実行結果:

このサンプルコードではchar型の文字列「str」内をstrstr関数を使って検索しています。

文字列「東京都」で検索した結果をchar型のポインタ「adr1」に返し、文字列「大阪府」で検索した結果を「adr2」に返しています。

文字列「東京都」で検索した場合、「str」内に「東京都」が含まれるので「東京都」の先頭のアドレスをポインタ「adr1」に返し、「東京都」から終端文字NULLまで表示しています。

文字列「大阪府」で検索した場合、「str」内に「大阪府」が含まれませんのでポインタ「adr2」にはNULLを返しています

正規表現での検索方法について

C言語では正規表現を使って文字列内を検索することができます。

正規表現の書き方と正規表現での検索方法についてみていきましょう。

正規表現の書き方について

正規表現とはいくつかの文字列を一つの形式でまとめて表現するための表現方法のことです。

主な正規表現については下記のとおりになります。

正規表現:

記号記号の説明例の説明
.任意の1文字。改行文字は除く。.+任意の文字列
*直前の1文字の0回以上の繰り返しと一致hoge*hogeもしくはhogee...と一致
^行の先頭^[0-9]行頭が数字
$行の末尾^.{10}$10文字の行
[ ]カッコ内の任意の1文字と一致。「-」で範囲指定可。[a-z]小文字のアルファベット1文字と一致
[^ ]カッコ内の任意の1文字と不一致。「-」で範囲指定可。[^A-Z]大文字のアルファベット以外
+直前の文字の1個以上の繰り返しと一致hoge+hogee...と一致
?直前の文字が0個または1個の場合に一致hoge?hogeもしくはhogと一致
{ }カッコ内の数値の繰り返しと一致{n}直前の文字のn個の繰り返しと一致
同上{,n}直前の文字のn個以下の繰り返しと一致
同上{m,}直前の文字のm個以上の繰り返しと一致
同上{m,n}直前の文字のm個以上、n個以下の繰り返しと一致
|直前、直後どちらかのパターンに一致hoge|piyohogeまたはpiyo
( )カッコ内をグループ化。マッチした内容は参照可。

正規表現を使った検索方法について

C言語で正規表現を使った文字列内の検索を行うには、ヘッダーファイル「regex.h」をインクルードする必要があります。

Windows環境下では「regex.h」やこれに関連するライブラリがインストールされていない場合もありますので、その場合は使っている環境にあわせて用意をする必要があります。

例えばMinGW(Minimalist GNU for Windows)を使用している場合は、sorceforgeからインクルードファイル、ライブラリファイルなどのダウンロードが可能です。

正規表現を使った検索を行うには、正規表現のオブジェクトを格納するregex_t型の構造体と、正規表現にマッチしたインデックスを格納するregmatch_t型の構造体の配列が必要となります。

また次の3つの関数を使用します。

regcomp:

regexec:

regfree:

それではサンプルコードで確認していきましょう。

実行結果:

このサンプルコードではchar型の文字列「str」内をを正規表現の文字列「pattern」 で検索しています。

regmatch_t型のオブジェクトの配列には要素が5つ格納されるように記述しています。

regcomp関数を使って 正規表現のコンパイルを行っています。

コンパイルが成功すると、regexec関数を使って正規表現による検索を行っています。

検索の結果マッチしていると、それぞれのregmatch_t型のオブジェクトからメンバ「rm_so」を使ってマッチした文字列の先頭のインデックスの値と、メンバ「rm_eo」を使って終端のインデックスの値を呼び出しています。

先頭のインデックスの値から終端のインデックスの値を元に1文字ずつ文字を表示することで、正規表現にマッチした文字列を出力表示しています。

文字列の使い方総まとめ

この記事では紹介しきれなかった文字列のいろいろな使い方を次の記事にまとめているので、ぜひ確認してください!

【C言語入門】文字列とは?文字列の使い方総まとめ
更新日 : 2019年5月20日

まとめ

ここでは、文字列の検索について説明しました。

短い文字列から1つの指定文字・文字列を検索するような簡単な検索であれば、strchrおよびstrstrを使うと便利かと思います。

形式が決まっていて指定文字・文字列が複数で多い場合などは正規表現を使う方が便利です。

それぞれを使いこなすことができるように、この記事を何度も参考にして下さいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

長野 透

長野 透

熊本在住のフリープログラマ兼ライターです。C/C++/C#、Java、Python、HTML/CSS、PHPを使ってプログラミングをしています。専門は画像処理で最近は機械学習、ディープラーニングにはまっています。幅広くやってきた経験を活かしてポイントをわかりやすくお伝えしようと思います。
お問合せはこちらでも受け付けています。
[email protected]

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説