SQL中的SQLite并支持REGEXP

SK9*_*SK9 7 c regex sqlite

我正在使用sqlite3,C我想添加对REGEXP运营商的支持.默认情况下,regexp()不存在用户定义的函数,并且调用REGEXP通常会导致错误(根据SQLite页面).

  1. 如何添加regexp支持功能REGEXP?大概我会通过sqlite3_create_function调用来做到这一点,但我不知道应用程序定义的是什么regexp()样子.

  2. 我可以使用一个函数从regex.h具有sqlite3_create_function怎么样?我传递给SQLite的任何函数都必须使用sqlite3_context*,int,sqlite3_value**类型的三个参数.但是,SQLite文档似乎没有解释这些参数的含义.

  3. 是否有C regexp()函数的示例代码?

我无法使用Google或SQLite页面找到很多相关内容.

小智 6

您也可以尝试以下操作:

#include <regex.h>
Run Code Online (Sandbox Code Playgroud)

...

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(&regex, reg, REG_EXTENDED | REG_NOSUB);
    if ( ret != 0 ) {
        sqlite3_result_error(context, "error compiling regular expression", -1);
        return;
    }

    ret = regexec(&regex, text , 0, NULL, 0);
    regfree(&regex);

    sqlite3_result_int(context, (ret != REG_NOMATCH));
}
Run Code Online (Sandbox Code Playgroud)

...

sqlite3_create_function(*db, "regexp", 2, SQLITE_ANY,0, &sqlite_regexp,0,0)
Run Code Online (Sandbox Code Playgroud)