2012-09-19 40 views
1

我有以下查詢:Mysql的正則表達式查找這兩個詞語在文

SELECT * `library` WHERE 
    ( 
    UCASE( `text`) REGEXP '((^KEYWORD|[[.space.]]KEYWORD)([[.space.]]|[[.comma.]]|[[.period.]]|[[.colon.]]|[[.semicolon.]]|[[.apostrophe.]]|[[.quotation-mark.]]|[[.exclamation-mark.]]|[[.question-mark.]]))((^KEYWORD2|[[.space.]]KEYWORD2)([[.space.]]|[[.comma.]]|[[.period.]]|[[.colon.]]|[[.semicolon.]]|[[.apostrophe.]]|[[.quotation-mark.]]|[[.exclamation-mark.]]|[[.question-mark.]]))' 
    ) 

**編輯**

增加了一個SQL小提琴:

http://sqlfiddle.com/#!2/8f822/2/0

可讀格式此是:

SELECT * FROM `library` WHERE 
    ( 
    UCASE( `text`) REGEXP ' 
      (
       (
       ^KEYWORD | [[.space.]]KEYWORD 
       ) 
       (
       [[.space.]] | 
       [[.comma.]] | 
       [[.period.]] | 
       [[.colon.]] | 
       [[.semicolon.]] | 
       [[.apostrophe.]] | 
       [[.quotation-mark.]] | 
       [[.exclamation-mark.]] | 
       [[.question-mark.]] 
       ) 
      ) 

      (
       (
       ^KEYWORD2 | [[.space.]]KEYWORD2 
       ) 
       (
       [[.space.]] | 
       [[.comma.]] | 
       [[.period.]] | 
       [[.colon.]] | 
       [[.semicolon.]] | 
       [[.apostrophe.]] | 
       [[.quotation-mark.]] | 
       [[.exclamation-mark.]] | 
       [[.question-mark.]] 
       ) 
      ) 
     )' 

現在我需要查詢來做下面的事情,我在這裏打磚牆。

如果關鍵字出現在文本中,開始文本或以空格開頭,然後是其中一個特殊字符,然後顯示結果。

這實際上並不像我需要的那樣工作,但我無法在文檔中找到如何在兩者都出現時進行匹配。例如試圖將字符串"keyword,""keyword ""keyword;"

然後我需要匹配一個相同類型的查詢關鍵字2.

匹配,則關鍵字和關鍵字2需要兩個表達式是真實的,我只需要這些結果。

例如文本

A lazy brown fox jumped over the fence. 
Then he found a chicken. 
Then he ate the chicken and ran from the farmer. 

A fox found a chicken. 
Then he ate the chicken and ran from the farmer. 
Then fox jumped over the fence. 

應該來運算與他以下關鍵字fencechicken

但這不應該符合以下文本

A lazy brown fox jumped over the fences. 
Then he found a chicken. 
Then he ate the chicken and ran from the farmer. 

ANSWER

最後的查詢已經成爲

SELECT * 
FROM`library` 
WHERE 
UCASE(`text`) REGEXP '(^|)FENCE[[.space.][.comma.][.period.][.colon.][.semicolon.][.apostrophe.][.quotation-mark.][.exclamation-mark.][.question-mark.]]' 
AND 
UCASE(`text`) REGEXP '(^|)CHICKEN[[.space.][.comma.][.period.][.colon.][.semicolon.][.apostrophe.][.quotation-mark.][.exclamation-mark.][.question-mark.]]' 

,因爲正則表達式不支持隨機順序搜索,因爲我不希望做ň至數的電源關鍵字搜索字符串這是最好的解決方案。

感謝所有的觀看。

回答

1

您可以使用正則表達式(^|)KEYWORD[- ,.:;'"!?]並將兩個REGEXP測試放在WHERE子句中並在一起。第一部分(^|)是一個正則表達式,它允許我們匹配文本或空間的開始。接下來是必須匹配的關鍵字,然後是一個[]之間的字符類,其中類的單個字符必須匹配。對於完整的正則表達式,它就像單個字符的OR,而不是|

SELECT * 
FROM`library` 
WHERE 
UCASE(`text`) REGEXP '(^|)KEYWORD[- ,.:;''"!?]' 
AND 
UCASE(`text`) REGEXP '(^|)KEYWORD2[- ,.:;''"!?]' 

聲明:我沒有測試過SQL語句,我不記得撇號是否必須在字符串內加倍。

+0

你能解釋一下請問你的正則表達式有什麼作用?從12年前我放棄了perl以來,正則表達式已經不是我的特長了... – Tschallacka

+0

您的查詢很好用http://sqlfiddle.com/#!2/8f822/6/0但現在我想知道是否有可能在一個正則表達式中做這一切? – Tschallacka

+0

可以製作一個正則表達式,但它會是一個醜陋的,比這個更不可讀。您將不得不考慮不同的情況:先關鍵字1然後關鍵字2或第一關鍵字2然後關鍵字1。我認爲這個解決方案更好。事實上,如你所寫,當你得到兩個以上的關鍵字時,它很快就會變得難以管理。 – lkuty