【发布时间】:2016-03-11 05:59:39
【问题描述】:
我想在我的 Tcl 项目中包含正则表达式,但是当我运行我的代码时,我得到了这个错误:
没有这样的功能:REGEXP
我的代码如下所示:
return [brain eval "select * from bad WHERE input REGEXP '^(.){0}_'"]
我可以在数据库中测试这个确切的代码(我正在使用 BD 浏览器 for SQLite 来浏览数据库)并且它可以正常工作:
select * from uniq WHERE input REGEXP '^(.){1}0'
20 行返回自:select * from uniq WHERE input REGEXP '^(.){1}0'(耗时 18 毫秒)
所以 REGEXP 可以在浏览器中工作,但不能在我的 Tcl 脚本中工作。以下是我目前在这个问题上发现的:
- 其他人在 ruby 中遇到了同样的问题:How to turn on REGEXP in SQLite3 and Rails 3.1?
- Somone 在 iOS 中遇到了同样的问题,不得不使用 cretae_sqlite_function "No such function: REGEXP" in sqlite3 on iOS
- 如何在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 示例: How do I use regex in a SQLite query?
所以我得出的结论是,我必须自己编写某种函数才能使其工作,但我不知道该函数的外观。它只是将我制作的正则表达式传递给 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
}
感谢您提供的任何帮助或建议!
【问题讨论】: