SQLite查询[^]不起作用

时间:2017-07-15 18:33:28

标签: android regex sqlite

我检查了很多关于SO的帖子,它们似乎与我正在做的事情相符,但是我无法让它发挥作用,所以也许我错过了一些明显的东西。 像许多其他人一样,我试图只匹配单词而不是部分匹配,我尝试了所有[^ a-zA-Z]并且没有任何匹配,所以我试图将其缩小到更简单的测试用例,看起来像[]根本不为我工作。我使用此代码:

String flashcardSearchQuery = "SELECT * FROM " + TABLE_NAME + " where " + COLUMN_ENGLISH_WORD +
        " LIKE " + "'%" + search_str + "[^,]%'";

ArrayList<Flashcard> flashList = new ArrayList<>();

SQLiteDatabase database = this.getReadableDatabase();

Cursor cursor = database.rawQuery(flashcardSearchQuery, null);

因此,当我搜索所有&#39;时,它应匹配以下内容:

all  
mall  
all or nothing  

但不是这些:

all, whole  
recall, wow  

但我一无所获。类似的,当我尝试没有&#39; ^&#39;只是&#34; [,]%&#34;什么都不匹配,我错过了什么?

我在调试器中看到了这个输出,所以连接似乎有效,对吗?

SELECT * FROM其中english_word LIKE&#39;%little [^,]%&#39;

[更新] 很棒,两条建议(REGEXP / GLOB)都有效:

String flashcardSearchQuery = "SELECT * FROM " + TABLE_NAME + " where " + COLUMN_ENGLISH_WORD +
        " GLOB " + "'*[^a-zA-Z]" + search_str + "[^a-zA-Z]*'";

String flashcardSearchQuery = "SELECT * FROM " + TABLE_NAME + " where " + COLUMN_ENGLISH_WORD +
        " REGEXP " + "'.*[^a-zA-Z]" + search_str + "[^a-zA-Z].*'";

现在我只需要弄清楚如何包含搜索词是最终词的情况,例如

所有
这都是

有趣的是,许多引用似乎都表明LIKE应该与[] ...

一起使用

[2ND UPDATE] 我刚刚选择了2个班轮,虽然在正则表达式方面还不够精通,无法理解为什么它甚至涵盖了&#39; start&#39;排列:

String flashcardSearchQuery = "SELECT * FROM " + TABLE_NAME + " where " +
        COLUMN_ENGLISH_WORD + " REGEXP '.*[^a-zA-Z]" + search_str + "[^a-zA-Z].*' OR " +
        COLUMN_ENGLISH_WORD + " REGEXP '.*[^a-zA-Z]" + search_str + "'";

3 个答案:

答案 0 :(得分:1)

LIKE运算符不支持字符范围。

改为使用GLOB

C:\Users\vonc\data\git\git>git most
......... [wait a long time] .........
1585    Makefile
1060    cache.h
748     gitweb/gitweb.perl
730     refs/files-backend.c
714     diff.c
670     Documentation/config.txt
659     refs.c
624     git-svn.perl
600     sha1_file.c
517     contrib/completion/git-completion.bash
501     builtin/apply.c
499     Documentation/git.txt
491     GIT-VERSION-GEN
433     git-p4.py
413     git.c
407     builtin/pack-objects.c
401     revision.c
376     builtin/commit.c
336     merge-recursive.c
...

答案 1 :(得分:1)

可能这应该工作,即在逻辑中添加两个where子句并满足两者,一个用于搜索字符串,另一个用于逗号

String flashcardSearchQuery = "SELECT * FROM " + TABLE_NAME + " where " + COLUMN_ENGLISH_WORD + " LIKE " + "'%" + search_str + "%' AND "  + COLUMN_ENGLISH_WORD + " NOT LIKE '%,%'";

答案 2 :(得分:0)

LIKE 不够强大,无法使用正则表达式。

尝试使用 REGEXP

Select * from table_name where some_string REGEXP '.*all[^,\.]*'