2010-11-08 47 views
3

MySQL手冊對於它支持的表達式並不是非常詳細,所以我不確定以下是否可以使用MySQL。MySQL中的負面反向引用REGEXP

我想創建一個與RLIKE匹配的查詢,如下所示。

任務是從SQL獲取所有包含給定句子中至少任意兩個單詞的句子。

比方說,我有一定的單詞正則表達式來使用:

hello, dog 

我有以下數據庫中的句子:

hello from dog 
hello hello cat 
dog says hello 
dog dog goes away 
big bad dog 

從這些所有我想只匹配

hello from dog 
dog says hello 

現在我有這樣的:

SELECT * 
FROM test 
WHERE 
test RLIKE '(hello|dog).*(hello|dog)' 

的問題是 - 我得到的還有那些不需要的

hello hello cat 
dog dog goes away 

所以我想,我還需要第二次前右反向引用(你好|狗)。

在僞代碼它應該是這樣的:

RLIKE '(hello OR dog) anything can be here (hello OR dog, but not the word which already was in the previous group)' 

所以它可能是這樣的:

'(hello|dog).*(negative backreference to the 1st group goes here)(hello|dog)' 

能等不利的反向引用在MySQL正則表達式來實現? 或者,也許有更好的方法來寫同樣的事情的正則表達式,但也考慮到將由一些C++代碼生成查詢,所以它不應該太複雜,以生成?

+1

這聽起來像是建立一個單詞索引 - >句子映射(然後簡單地查詢索引)的東西。 – Amber 2010-11-08 09:04:36

+1

或'(hello。* dog | dog。* hello)'?如果總是隻有兩個單詞,那麼 – Konerak 2010-11-08 09:05:56

+0

(hello。* dog | dog。* hello)會很棒,但也可能會有更多,然後我必須自己創建所有可能的單詞組合。 – JustAMartin 2010-11-08 09:50:37

回答

5

MySQL uses a Posix Extended Regular Expression enginePOSIX ERE),因此根本不支持反向引用。它也不支持你想要構造一個可以處理這個問題的單個正則表達式。

因此,你必須拼寫出所有可能的組合:

hello.*dog|dog.*hello 

當然,這將讓笨拙如果匹配的候選人數量的增加,因此正則表達式是不是該在MySQL正確的工具,除非你可以安裝/使用LIB_MYSQLUDF_PREG