Cで正規表現を使用しています(「regex.h」ライブラリを使用)。regcomp(...) と regexec(...) の標準呼び出し (およびチェック) を設定した後、コンパイルした正規表現に一致する実際の部分文字列のみを出力できます。マニュアルページによると、regexec を使用するということは、部分文字列の一致を「regmatch_t」として知られる構造に格納することを意味します。構造体には、メモリ内の一致した部分文字列の文字のアドレスであると私が理解しているものを参照するための rm_so と rm_eo のみが含まれていますが、これらをオフセットと 2 つのポインターに使用して実際の部分文字列を抽出し、それを配列 (理想的には文字列の 2D 配列)?
標準出力に出力するだけで機能しますが、同じ設定を使用して文字列/文字配列に保存しようとすると、式との照合に最初に使用された文字列全体が保存されます。さらに、print ステートメント内の「%.*s」とは何ですか? 文字配列へのポインターを正しく読み取るのは、それ自体が正規表現だと思います。一致した部分文字列をコレクション内に保存して、ソフトウェアの他の場所で作業できるようにしたいだけです。
背景: p と p2 はどちらも、以下のコードで while ループに入る前に、一致する文字列の先頭を指すように設定されたポインターです。以下に示すメインループの前に]
int ind = 0;
while(1){
regExErr1 = regexec(&r, p, 10, m, 0);
//printf("Did match regular expr, value %i\n", regExErr1);
if( regExErr1 != 0 ){
fprintf(stderr, "No more matches with the inherent regular expression!\n");
break;
}
printf("What was found was: ");
int i = 0;
while(1){
if(m[i].rm_so == -1){
break;
}
int start = m[i].rm_so + (p - p2);
int finish = m[i].rm_eo + (p - p2);
strcpy(matches[ind], ("%.*s\n", (finish - start), p2 + start));
printf("Storing: %.*s", matches[ind]);
ind++;
printf("%.*s\n", (finish - start), p2 + start);
i++;
}
p += m[0].rm_eo; // this will move the pointer p to the end of last matched pattern and on to the start of a new one
}
printf("We have in [0]: %s\n", temp);