我正在寻找一个可以将正则表达式存储为值的数据库.例如这样的事情:
{: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扩展允许我存储正则表达式?
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;
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.
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+/返回带有正则表达式的第二个文档.