是否有可以将正则表达式存储为值的数据库?

时间:2015-06-15 05:13:56

标签: regex database

我正在寻找一个可以将正则表达式存储为值的数据库。例如。像这样的事情:

{: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扩展允许我存储正则表达式?

3 个答案:

答案 0 :(得分:7)

Oracle数据库可以做到这一点。

示例查询:WHERE REGEXP_LIKE(first_name, '^Ste(v|ph)en$')

您想从列中选择正则表达式,请参阅下面的SQL Fiddle示例。

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 的行