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

A.V*_*rno 8 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/}
Run Code Online (Sandbox Code Playgroud)

所以我可以根据查询是否匹配表达式返回行/文档(例如"FIND rows WHERE"tt"=〜:expression").并得到蒂姆和菲尔行作为结果.大多数数据库都可以完全相反(检查文本字段是否与正则表达式查询匹配).但不幸的是,mongo和postgres都不能做相反的事情.

PS或者我错了,有一些postgres或mongo扩展允许我存储正则表达式?

Ely*_*Ely 7

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

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

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


SQL小提琴

选择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;
Run Code Online (Sandbox Code Playgroud)

执行一条SQL语句,例如(正如您在问题中提到的):

SELECT * FROM regexp WHERE REGEXP_LIKE('tt', regexp);
Run Code Online (Sandbox Code Playgroud)

产量:

NAME    COUNT   REGEXP
Tim     3       t+
Fil     1       tt
Run Code Online (Sandbox Code Playgroud)

参考这里.

摘抄:

Oracle数据库通过一组Oracle数据库SQL函数和条件实现正则表达式支持,使您能够搜索和操作字符串数据.您可以在支持Oracle Database SQL的任何环境中使用这些功能.您可以在文本文字,绑定变量或任何包含CHAR,NCHAR,CLOB,NCLOB,NVARCHAR2和VARCHAR2(但不是LONG)等字符数据的列上使用这些函数.

还有一些需要考虑的信息:

REGEXP函数或条件中的字符串文字符合SQL文本文字的规则.默认情况下,正则表达式必须用单引号括起来.如果正则表达式包含单引号字符,则输入两个单引号以表示表达式中的单个引号.此技术可确保SQL函数解释整个表达式,并提高代码的可读性.您还可以使用q-quote语法定义自己的字符以终止文本文字.例如,您可以使用井号(#)分隔正则表达式,然后在表达式中使用单引号.

注意:如果表达式来自列或绑定变量,则引用的相同规则不适用.

请注意,没有名为RegEx的列类型,您需要在文本列中按原样保存字符串.

您还可以在约束检查和项目列中使用RegEx.

  • 但正则表达式存储在表中,因此您应该调整您的示例 (3认同)

Ben*_*gar 6

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+/ }
Run Code Online (Sandbox Code Playgroud)

您可以使用它来查询具有与查询匹配的正则表达式的行,如下所示:

> db.mycoll.find(function() { return this.myregex.test('a'); } )
{ "_id" : ObjectId("5826414949bf0898c1059b39"), "myregex" : /a+/ }
Run Code Online (Sandbox Code Playgroud)

在这里,我们搜索字符串'a'与myregex字段匹配的行,从而/a+/返回带有正则表达式的第二个文档.