Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 25.02.2015 23:37
void VRegex::regex_options(const String* options, int* result){ struct Regex_option { const char* key; const char* keyAlt; int clear; int set; int *result; } regex_option[]={ {"i", "I", 0, PCRE_CASELESS, result}, // a=A {"s", "S", 0, PCRE_DOTALL, result}, // ^\n\n$ [default] {"m", "M", PCRE_DOTALL, PCRE_MULTILINE, result}, // ^aaa\n$^bbb\n$ {"x", 0, 0, PCRE_EXTENDED, result}, // whitespace in regex ignored {"U", 0, 0, PCRE_UNGREEDY, result}, // ungreedy patterns (greedy by default) {"g", "G", 0, MF_GLOBAL_SEARCH, result+1}, // many rows {"'", 0, 0, MF_NEED_PRE_POST_MATCH, result+1}, {"n", 0, 0, MF_JUST_COUNT_MATCHES, result+1}, {0, 0, 0, 0, 0} }; result[0]=PCRE_EXTRA /* backslash+non-special char causes error */ | PCRE_DOTALL /* dot matches all chars including newline char */ | PCRE_DOLLAR_ENDONLY /* dollar matches only end of string, but not newline chars */; result[1]=0; if(options && !options->is_empty()){ size_t valid_options=0; for(Regex_option *o=regex_option; o->key; o++) if( options->pos(o->key)!=STRING_NOT_FOUND || (o->keyAlt && options->pos(o->keyAlt)!=STRING_NOT_FOUND) ){ *o->result &= ~o->clear; *o->result |= o->set; valid_options++; } if(options->length()!=valid_options) throw Exception(PARSER_RUNTIME, 0, CALLED_WITH_INVALID_OPTION); } } void VRegex::compile(){ const char* err_ptr; int err_offset; int options=foptions[0]; // @todo (for UTF-8): check string & pattern and use PCRE_NO_UTF8_CHECK option if(fcharset->isUTF8()) options |= (PCRE_UTF8 | PCRE_UCP); fcode=pcre_compile(fpattern, options, &err_ptr, &err_offset, fcharset->pcre_tables); if(!fcode){ throw Exception(PCRE_EXCEPTION_TYPE, new String(fpattern+err_offset, String::L_TAINTED), "regular expression syntax error - %s", err_ptr); } }