我想在我的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脚本中.这是我到目前为止在这个问题上发现的:
所以我得出的结论是,我必须自己编写某种函数才能使其工作,但我不知道该函数的外观是什么.它只是简单地传递我对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)
感谢您提供给我的任何帮助或建议!
实现正则表达式处理实际上非常简单.所有你需要做的(假设这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)
| 归档时间: |
|
| 查看次数: |
583 次 |
| 最近记录: |