2017-07-15 81 views
1

我檢查過很多帖子,他們似乎與我正在做的相匹配,但我無法讓它正常工作,所以也許我錯過了一些明顯的東西。 像許多其他人一樣,我只想匹配單詞而不是部分匹配,我嘗試了所有[^ a-zA-Z]並且沒有匹配,因此我試圖將其縮小到更簡單的測試用例,它看起來像[]根本不適合我。我使用此代碼:帶[^]的SQLite查詢不起作用

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); 

所以,當我搜索 '全部',它應該匹配這些:

all 
mall 
all or nothing 

但不是這些:

all, whole 
recall, wow 

但我一無所獲。類似,當我嘗試沒有'^'而只是「[,]%」沒有任何匹配時,我錯過了什麼?

我在調試器中看到了這個輸出,所以連接似乎工作,對吧?

SELECT * FROM話,其中english_word LIKE '%小[^,]%'

[更新]大,兩項建議(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應該用[] ...工作

[月2日更新]我剛剛塵埃落定了2套,雖然沒有足夠精通正則表達式中理解爲什麼它涵蓋了連「開始」排列:

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 + "'"; 
+2

據我所知,'LIKE'不支持您正在嘗試的語法。請參閱http://sqlite.org/lang_expr.html。 – CommonsWare

+0

但他們有一個接受的答案,使用LIKE,不是嗎? https://開頭計算器。com/questions/5444300/search-for-whole-word-match-with-sql-server-like-pattern – Mairyu

回答

0

同時滿足,一個用於搜索字符串和其他LIKE不夠強大,無法使用正則表達式。

嘗試使用REGEXP

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

+0

只需在搜索字詞前添加一個空格,使其成爲最終詞 – Maciej

+0

對不起,不知道在哪裏,在'全部'前面?這將如何工作?我或許可以用「OR」來解決它,但我希望單一的表達能夠覆蓋我所有的基礎。 – Mairyu

1

LIKE運算符不支持字符範圍。

使用GLOB代替:

... WHERE EnglishWord GLOB '*little[^,]*' 
1

可能這應該工作,即增加了兩個,其中有邏輯子句,併爲沒有逗號

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

這是我的後備,但我想涵蓋很多例外,這會讓這個過於繁瑣 – Mairyu

+0

In我建議的情況是把所有的異常放在一個表中。加入此表以排除行。 – DhruvJoshi