我在C中使用sqlite3,我想添加对REGEXP运算符的支持.默认情况下,用户定义的函数
regexp()不存在,调用REGEXP通常会导致错误(根据sqlite页面).
>如何添加正则表达式函数以支持REGEXP?大概我会通过sqlite3_create_function调用来做到这一点,但我不知道应用程序定义的regexp()会是什么样子.
>我可以使用regex.h中的函数和sqlite3_create_function以及如何使用?我传递给sqlite的任何函数都必须使用sqlite3_context *,int,sqlite3_value **类型的三个参数.但是,sqlite文档似乎没有解释这些参数的含义.
>是否有C regexp()函数的示例代码?
解决方法
你也可以试试这个:
#include <regex.h>
…
void sqlite_regexp(sqlite3_context* context,int argc,sqlite3_value** values) { int ret; regex_t regex; char* reg = (char*)sqlite3_value_text(values[0]); char* text = (char*)sqlite3_value_text(values[1]); if ( argc != 2 || reg == 0 || text == 0) { sqlite3_result_error(context,"sql function regexp() called with invalid arguments.\n",-1); return; } ret = regcomp(®ex,reg,REG_EXTENDED | REG_NOSUB); if ( ret != 0 ) { sqlite3_result_error(context,"error compiling regular expression",-1); return; } ret = regexec(®ex,text,NULL,0); regfree(®ex); sqlite3_result_int(context,(ret != REG_NOMATCH)); }
…
sqlite3_create_function(*db,"regexp",2,sqlITE_ANY,&sqlite_regexp,0)