■要求定義
– 指定した文字列がテキスト内に存在した場合、その行を抽出する
e.g.
sample.txt
Aries
Taurus
Gemini
Cancer
Leo
Virgo
Libra
Scorpio
Sagittarius
Capricorn
Aquarius
Pisces
$ grep -n Leo sample.txt // オプションの-nは行数
5:Leo
$ grep -c Leo sample.txt // オプションの-cは回数
1
$ grep Cancer ./*
./sample.txt:Cancer
■検討事項
– 正規表現で、検索文字と完全一致する文字が含まれていれば、ファイル名を返す(return 0)として、含まれていなければreturn 1とするで良いか。
strchrで先頭が一致するアドレスをポインタで返す
#include <stdio.h>
#include <string.h>
int main(void){
char str[] = "100-0005";
char *adr1, *adr2;
adr1 = strchr(str, (int)'-'); //文字列 str の先頭から'-'を探し、最初に見つかった位置をポインタで返却
printf("result1: %s\n", adr1);
adr2 = strchr(str, (int)'x');
printf("result2: %s\n", adr2);
return 0;
}
$ ./dev
result1: -0005
result2: (null)
文字列の一致にはstrstrを使用する。
int main(void){
char str[] = "〒100-0005 東京都千代田区丸の内一丁目";
char *adr1, *adr2;
adr1 = strstr(str, "千代田区"); //文字列strの中から文字列を探しそのアドレスを返す
printf("result1: %s\n", adr1);
adr2 = strstr(str, "港区");
printf("result2: %s\n", adr2);
return 0;
}
$ ./dev
result1: 千代田区丸の内一丁目
result2: (null)
### 正規表現を使った方法
– ヘッダーファイル「regex.h」をインクルード
– 正規表現を使った検索を行うには、正規表現のオブジェクトを格納するregex_t型の構造体と、正規表現にマッチしたインデックスを格納するregmatch_t型の構造体の配列が必要
– regcomp():正規表現コンパイル, regexec():正規表現による検索実行, regfree():regex_t型のオブジェクトのメモリ解放 を使用する
int regcomp(regex_t *preg, const char *regex, int cflags)
int regexec(const regex_t *preg, const char *string, size_t nmatch, regmatch_t pmatch[], int eflags)
#include
#include
int main(void){
char str[] = "〒100-0005 東京都千代田区丸の内一丁目";
regex_t preg; // 正規表現のオブジェクト
size_t num = 5;
regmatch_t pmatch[num]; // 正規表現にマッチしたインデックスを格納
const char pattern[] = "〒([0-9]{3})-([0-9]{4})(.+)";
// 正規表現のコンパイル
if (regcomp(&preg, pattern, REG_EXTENDED|REG_NEWLINE) != 0){
printf("failed\n");
return -1;
}
// 入力文字列の出力
printf("input char is: %s\n", str);
// 正規表現による検索
if(regexec(&preg, str, num, pmatch, 0) != 0){
printf("does not matched\n");
} else {
for (int i = 0; i < num; i++){
if(pmatch[i].rm_so >= 0 && pmatch[i].rm_eo >= 0){
printf("matched index is %d~%d, str: ", (int)pmatch[i].rm_so, (int)pmatch[i].rm_eo);
for (int j = pmatch[i].rm_so ; j < pmatch[i].rm_eo; j++){
putchar(str[j]);
}
}
printf("\n");
}
}
// オブジェクトのメモリ開放
regfree(&preg);
return 0;
}