如何让sqlite3在Tcl中执行regexp

Leg*_*ack 4 regex sqlite tcl

我想在我的Tcl项目中包含regexp但是当我运行我的代码时出现此错误:

没有这样的功能:REGEXP

我的代码看起来像这样:

return [brain eval "select * from bad WHERE input REGEXP '^(.){0}_'"]
Run Code Online (Sandbox Code Playgroud)

我可以在数据库中测试这个确切的代码(我使用BD浏览器访问SQLite来浏览数据库)并且它可以正常工作:

select * from uniq WHERE input REGEXP '^(.){1}0'
Run Code Online (Sandbox Code Playgroud)

20行返回:select*from uniq WHERE输入REGEXP'^(.){1} 0'(耗时18ms)

因此REGEXP将在浏览器中工作,但不在我的Tcl脚本中.这是我到目前为止在这个问题上发现的:

  1. 其他人在ruby中遇到同样的问题:如何在SQLite3和Rails 3.1中打开REGEXP?
  2. Somone在iOS中遇到了同样的问题,不得不在iOS 上的sqlite3中使用 cretae_sqlite_function "没有这样的功能:REGEXP"
  3. 如何在sqlite中编写函数:https://www.sqlite.org/c3ref/create_function.html
  4. 如何在Tcl中编写sqlite函数:https: //www.sqlite.org/tclsqlite.html
  5. 我可能要用ruby编写的函数示例:https: //github.com/sei-mi/sqlite3_ar_regexp/blob/master/lib/sqlite3_ar_regexp/extension.rb
  6. 默认情况下未定义REGEXP用户功能:http: //www.sqlite.org/lang_expr.html#regexp
  7. REGEXP用户定义函数的PHP示例: 如何在SQLite查询中使用正则表达式?

所以我得出的结论是,我必须自己编写某种函数才能使其工作,但我不知道该函数的外观是什么.它只是简单地传递我对sqlite3的正则表达式吗?或者是否将正则表达式转换为其他内容然后传递给它?

该功能看起来像这样吗?

file mkdir db
sqlite3 db ./brain/brain.sqlite -create true

db eval { create_function('regexp', 2) do |func, pattern, expression|
            func.result = expression.to_s.match(
            Regexp.new(pattern.to_s, Regexp::IGNORECASE)) ? 1 : 0
         end
         }  
Run Code Online (Sandbox Code Playgroud)

感谢您提供给我的任何帮助或建议!

Don*_*ows 6

实现正则表达式处理实际上非常简单.所有你需要做的(假设这db是你的连接句柄)是使用这样的function方法:

db function regexp -deterministic {regexp --}
Run Code Online (Sandbox Code Playgroud)

这告诉SQLite创建函数,它是确定性的(正如大多数情况下正则表达式匹配)并且它应该通过将参数传递给regexp --(--停止-引发问题的RE ).

从此会话日志中查看:

% package require sqlite3
3.8.10.2
% sqlite3 db :memory:
% db eval {select 1 where 'abc' regexp 'b'}
no such function: regexp
% db function regexp -deterministic {regexp --}
% db eval {select 1 where 'abc' regexp 'b'}
1
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!看起来很简单但我从来没有想过自己想出来的!我也发现,LIKE,使用"_"可以处理我正在使用regexp的大部分内容,因此对于有这个问题的其他人来说可能是一个可行的选择. (2认同)