使用正则表达式的 SQLite 查询

Posted

技术标签:

【中文标题】使用正则表达式的 SQLite 查询【英文标题】:SQLite query with regex 【发布时间】:2014-09-11 12:03:38 【问题描述】:

我正在使用 Java,我有一个数据库,SQLite 3.8.5,有 2 个列,ID(int key)note(string)。 我希望能够查询包含多个单词的所有笔记。

示例: 注 1:“你好,这部电影是 foo” 注2:“你好,这部电影是黄色的” 注3:“你好,这部电影是”(尤达,不要打字!) 给定用户过滤词:“foo”“movie”

查询的结果应该是注1和注2。

此正则表达式有效,但我似乎无法找到如何将正则表达式作为查询:.*(?=.*movie)(?=.*foo).*

BR

【问题讨论】:

【参考方案1】:

为了完整起见,除了上面的答案,Java 中的解决方案。您必须为 REGEXP 运算符应该工作的每个连接执行此操作。

// Create regexp() function to make the REGEXP operator available
Function.create(connection, "REGEXP", new Function() 
  @Override
  protected void xFunc() throws SQLException 
    String expression = value_text(0);
    String value = value_text(1);
    if (value == null)
      value = "";

    Pattern pattern=Pattern.compile(expression);
    result(pattern.matcher(value).find() ? 1 : 0);
  
);

【讨论】:

【参考方案2】:

SQLite 有一个REGEXP 运算符,用于比较值。问题是默认情况下 SQLite 不提供正则表达式比较的实现,所以你必须提供一个。这是通过实现regexp()自定义SQL函数来完成的。

要了解如何实现自定义 SQL 函数,请参阅:Writing user defined SQL functions for SQLite using Java or Groovy?

换句话说,您必须通过提供完成这项工作的 Java 函数来告诉 SQLite 它应该如何执行正则表达式匹配。

实现regexp 函数后,您可以开始在SQL 查询中使用REGEXP 运算符。

【讨论】:

以上是关于使用正则表达式的 SQLite 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中使用正则表达式运行查询

Python SQLite 正则表达式 ExecuteMany

SQLite正则表达式用于查找字符串不在预定义集中的行

与正则表达式捕获字符串一起使用时,SQLite SELECT 在 Ruby 中不起作用,但与字符串文字一起使用

SQL数据库查询使用正则表达式如何查询中文?

mongodb 正则表达式查询性能问题