括弧に囲まれたテキストを抽出
括弧に囲まれたテキストを抽出するプログラムを書いてみた。
sscanfで手抜きができないSJIS対策に作ったけど、多少苦労したので残しておきたい。
たとえば
char test[1024]; strcpy(test,"てきすとを\"読み出す\"テスト。"); char* p=NULL; char* p2 = GetTextInBrackets(test,p,'"','"');
とあったときに
pに「読み出す」が、p2に「テスト」が入るような仕様にしてみた。
//ヘッダ /** * @brief 括弧に囲まれたテキストを取り出す * @note ShiftJIS対策。括弧はマルチバイト非対応 * @param[out] pText 抽出したテキスト * @param[in] pBra 括弧開く * @param[in] pKet 括弧閉じ * @return 括弧閉じの次のポインタ */ extern char* GetTextInBrackets(char*pInput,char*& pText,char nBra='\"',char nKet='\"');
//cpp char* GetTextInBrackets(char* pInput,char*& pText,char nBra,char nKet){ pText = pInput; if(nBra==nKet){//括弧開=閉の場合は括弧の内外が交互にくる while(*pText!=nBra){ pText++; if(pText==0)return NULL; } //開くを発見 char* p = ++pText; while(*p!=nKet){ p++; if(*p=='\0')return NULL; } //閉じるを発見 *p='\0'; return ++p; } else{//括弧開!=閉の場合は括弧閉の対応が異なる //開を見つける while(*pText!=nBra){ pText++; if(pText==0)return NULL; } //開を発見 char* p = pText++; int n=1; while(n>0){ p++; if(*p==nBra) n++; if(*p==nKet) n--; if(*p==0)return NULL; } *p='\0'; return ++p; } } }
せっかくだったので
char test[1024]; strcpy(test,"てきすとを(読(み出)す)テスト。"); char* p=NULL; char* p2 = GetTextInBrackets(test,p,'(',')');
にも対応してみた。
これを実行するとpには「読(み出)す」が挿入される。ちゃんと括弧開く、閉じるの個数に対応させたわけである。
ちなみに(見れば分かると思うが)途中で文章が終わっている場合はNULLが返される。