当前位置:  开发笔记 > 编程语言 > 正文

如何让sqlite3在Tcl中执行regexp

如何解决《如何让sqlite3在Tcl中执行regexp》经验,为你挑选了1个好方法。

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

没有这样的功能:REGEXP

我的代码看起来像这样:

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

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

select * from uniq WHERE input REGEXP '^(.){1}0'

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

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

    其他人在ruby中遇到同样的问题:如何在SQLite3和Rails 3.1中打开REGEXP?

    Somone在iOS中遇到了同样的问题,不得不在iOS 上的sqlite3中使用 cretae_sqlite_function "没有这样的功能:REGEXP"

    如何在sqlite中编写函数:https://www.sqlite.org/c3ref/create_function.html

    如何在Tcl中编写sqlite函数:https: //www.sqlite.org/tclsqlite.html

    我可能要用ruby编写的函数示例:https: //github.com/sei-mi/sqlite3_ar_regexp/blob/master/lib/sqlite3_ar_regexp/extension.rb

    默认情况下未定义REGEXP用户功能:http: //www.sqlite.org/lang_expr.html#regexp

    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
         }  

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



1> Donal Fellow..:

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

db function regexp -deterministic {regexp --}

这告诉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


谢谢!看起来很简单但我从来没有想过自己想出来的!我也发现,LIKE,使用"_"可以处理我正在使用regexp的大部分内容,因此对于有这个问题的其他人来说可能是一个可行的选择.
推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有