我正在寻找一个可以将正则表达式存储为值的数据库。例如。像这样的事情:
{:name => "Tim", :count => 3, :expression => /t+/},
{:name => "Rob", :count => 4, :expression => /a\d+/},
{:name => "Fil", :count => 1, :expression => /tt/},
{:name => "Marc", :count => 1, :expression => /bb/}
所以我可以根据查询是否匹配表达式返回行/文档(例如“FIND rows WHERE”tt“=〜:expression”)。并得到蒂姆和菲尔行作为结果。大多数数据库都可以完全相反(检查文本字段是否与正则表达式查询匹配)。但不幸的是,mongo和postgres都不能做相反的事情。
P.S。或许我错了,有一些postgres或mongo扩展允许我存储正则表达式?
答案 0 :(得分:7)
Oracle数据库可以做到这一点。
示例查询:WHERE REGEXP_LIKE(first_name, '^Ste(v|ph)en$')
您想从列中选择正则表达式,请参阅下面的SQL Fiddle示例。
选择Oracle数据库。
在架构窗口中执行以下命令:
CREATE TABLE regexp (name VARCHAR2(20), count NUMBER, regexp VARCHAR2(50));
INSERT INTO regexp VALUES ('Tim', 3, 't+');
INSERT INTO regexp VALUES ('Rob', 4, 'a\d+');
INSERT INTO regexp VALUES ('Fil', 1, 'tt');
INSERT INTO regexp VALUES ('Marc', 1, 'bb');
COMMIT;
执行SQL语句,例如(正如你在问题中提到的那样):
SELECT * FROM regexp WHERE REGEXP_LIKE('tt', regexp);
收率:
NAME COUNT REGEXP
Tim 3 t+
Fil 1 tt
参考here。
<强> 摘录: 强>
Oracle数据库使用一组实现正则表达式支持 Oracle Database SQL函数和条件,使您可以搜索 并操纵字符串数据。您可以在任何中使用这些功能 支持Oracle数据库SQL的环境。你可以使用这些 函数在文本文字,绑定变量或任何包含的列上 字符数据,如CHAR,NCHAR,CLOB,NCLOB,NVARCHAR2和 VARCHAR2(但不是很长)。
还需要考虑更多信息:
REGEXP函数或条件中的字符串文字符合 SQL文本文字的规则。默认情况下,正则表达式必须是 用单引号括起来。如果你的正则表达式包括 单引号字符,然后输入两个单引号 表示表达式中的一个单引号。这个 技术确保SQL解释整个表达式 功能并提高代码的可读性。你也可以使用 q-quote语法用于定义自己的字符以终止文本 文字。例如,您可以使用分隔正则表达式 英镑符号(#)然后在表达式中使用单引号。
注意:如果您的表达式来自列或绑定变量,那么 引用的相同规则不适用。
请注意,没有名为RegEx的列类型,您需要在文本列中按原样保存字符串。
此外,您可以在约束检查和项目列投影时使用RegEx。
答案 1 :(得分:5)
MongoDB允许您存储实际的正则表达式(即不是表示正则表达式的字符串),如下所示:
> db.mycoll.insertOne({myregex: /aa/})
{
"acknowledged" : true,
"insertedId" : ObjectId("5826414249bf0898c1059b38")
}
> db.mycoll.insertOne({myregex: /a+/})
{
"acknowledged" : true,
"insertedId" : ObjectId("5826414949bf0898c1059b39")
}
> db.mycoll.find()
{ "_id" : ObjectId("5826414249bf0898c1059b38"), "myregex" : /aa/ }
{ "_id" : ObjectId("5826414949bf0898c1059b39"), "myregex" : /a+/ }
您可以使用它来查询具有与查询匹配的正则表达式的行,如下所示:
> db.mycoll.find(function() { return this.myregex.test('a'); } )
{ "_id" : ObjectId("5826414949bf0898c1059b39"), "myregex" : /a+/ }
在这里,我们搜索字符串'a'与myregex
字段匹配的行,从而返回第二个文档,其中包含正则表达式/a+/
。
答案 2 :(得分:0)
添加到 Ely 的答案中,是想让大家知道 MySQL 也支持这一点。 在 http://sqlfiddle.com/ 中,我使用 MySQL 5.6 进行了测试 构建架构:
CREATE TABLE rule (name VARCHAR(20), tot INT, exp VARCHAR(50));
INSERT INTO rule VALUES ('Tim', 3, 't+');
INSERT INTO rule VALUES ('Rob', 4, 'a\d+');
INSERT INTO rule VALUES ('Fil', 1, 'tt');
INSERT INTO rule VALUES ('Jack', 1, '^tt$');
INSERT INTO rule VALUES ('Marc', 1, 'bb');
COMMIT;
测试:
select * from rule where 'ttt' RLIKE exp ;
预期:Tim 和 Fil 的行