私が探しているのは、基本的には括弧内のテキストを抽出することと同等であり、それが私が使用する例です。私の入力が(test 1 2)(test 3 4)test foo bar(test again)
以下のコードのようなものである場合、私が望むものを正確に返します:
token: test 1 2
token: test 3 4
token: test again
しかし、私の入力(test 1 (test 2 3)foo(bar test) again)
が
token: test 1
token: test 2 3
token: bar test
見たくないtest 1
。はい、左括弧と右括弧の間にありますが、このデータのさらに上流で何か問題が発生したことを意味します。
void print_tokens(char *s) {
printf("input: %s\n",s);
char *output;
const char *valid = "abcdefghijklmnopqrstuvwxyz0123456789 ";
unsigned int length;
s=strchr(s,'(')+1;
length=strspn(s,valid);
while(s!=NULL && length>0) {
output=malloc(length+1);
strncpy(output,s,length);
output[length]='\0';
printf("token: %s\n",output);
free(output);
if(strchr(s,'(')!=NULL) {
s=strchr(s,'(')+1;
length=strspn(s,valid);
} else {
s=NULL;
}
}
}
メモリ管理がかなり緩いことは別として、このスラップダッシュアプローチは、別の関数があるため「十分に近い」可能性があります(出力が実際に渡され、独自の入力をチェックしますが、これでもいくつかの可能性があります)私が探しているものは正規表現で簡単に要約できますが (/.*\(([a-z0-9 ]*?)\)/
私は信じています)、多かれ少なかれ標準的な C でなければなりません.GNU C 、Boost、および文字列の解析や正規表現に役立つ他のライブラリのほとんどは利用できません。
余分なトークンを排除するこのテキストを引き出すより良い方法はありますか? また、有効な文字セット (たとえば、左右の括弧以外のすべて) をより柔軟に使用できますか?