如何在Sqlite Android中实现单词边界?

8 regex sqlite android word-boundary

我想实现以下(全文搜索),

SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]'
Run Code Online (Sandbox Code Playgroud)

我只对全文列中的精确字符串(而不仅仅是单词)感兴趣.

我一直在使用MySQL中的确切SQL,现在将大部分代码迁移到Android应用程序.

但我一直在看各种帖子,其中提到Android Sqlite不支持REGEXP(例如:link1,link2,link3).

有没有办法在Android中启用REGEXP?

如果没有上述SQL的替代品?

谢谢,

编辑: 目前我在Android中使用REGEXP时收到以下异常,

android.database.sqlite.SQLiteException: no such function: REGEXP (code 1):...
Run Code Online (Sandbox Code Playgroud)

我知道我们可以使用GLOB和LIKE(或者甚至可以使用MATCH).如何columnname REGEXP '[[:<:]]somestring[[:>:]]'转换为使用GLOB和/或LIKE和/或MATCH

解决方案1:随着@cybersam的帮助,我正在使用(经过一些修改)

SELECT * FROM tablename where
  (columnname GLOB '*some string*' OR columnname GLOB '*Some string*') AND 
(
(
    (columnname GLOB '*[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]*' AND
    columnname GLOB '*some string[^a-zA-Z0-9_]*' AND
    columnname GLOB '*[^a-zA-Z0-9_]some string*')
OR
    (columnname GLOB '*[^a-zA-Z0-9_]Some string[^a-zA-Z0-9_]*' AND
    columnname GLOB '*Some string[^a-zA-Z0-9_]*' AND
    columnname GLOB '*[^a-zA-Z0-9_]Some string*')
)
)
Run Code Online (Sandbox Code Playgroud)

GLOB 区分大小写,所以我有一个额外的 OR

在我的情况下,@ cybersam的第二个解决方案要快得多.

解决方案2:处理灵敏度不足的情况

SELECT * FROM tablename where
  (columnname GLOB '*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]*') AND 
(
    (
    columnname GLOB '*[^a-zA-Z0-9_][sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG][^a-zA-Z0-9_]*' AND 
    columnname GLOB '*[sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG][^a-zA-Z0-9_]*' AND 
    columnname GLOB '*[^a-zA-Z0-9_][sS][oO][mM][eE] [sS][tT][rR][iI][nN][gG]*')
)
Run Code Online (Sandbox Code Playgroud)

cyb*_*sam 9

要实际支持REGEXP,您必须添加自己的regexp()用户函数.

这个链接可能会帮助您弄清楚如何为Android创建用户定义的函数 - 但这并不简单.

如果您的模式非常简单,那么GLOB运算符可能就足够了.

例如,要执行与此MYSQL查询等效的搜索:

SELECT * FROM tablename where columnname REGEXP '[[:<:]]some string[[:>:]]'
Run Code Online (Sandbox Code Playgroud)

你可以在SQLite中试试这个:

SELECT * FROM tablename where
  columnname GLOB '[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]' OR
  columnname GLOB 'some string[^a-zA-Z0-9_]' OR
  columnname GLOB '[^a-zA-Z0-9_]some string' OR
  columnname GLOB 'some string';
Run Code Online (Sandbox Code Playgroud)

上面的查询使用的事实是,在MYSQL中,单词字符被定义为字母数字字符或下划线.OR需要附加条款以匹配在任一侧(或两侧)上没有文本的情况some string.

最后,如果'some string'相对较少columnname,那么下面较长的查询实际上可能会更快,因为它只会对GLOB少数值进行多次评估:

SELECT * FROM tablename where
  columnname GLOB '*some string*' AND (
    columnname GLOB '[^a-zA-Z0-9_]some string[^a-zA-Z0-9_]' OR
    columnname GLOB 'some string[^a-zA-Z0-9_]' OR
    columnname GLOB '[^a-zA-Z0-9_]some string' OR
    columnname GLOB 'some string');
Run Code Online (Sandbox Code Playgroud)