Mysql正则表达式在文本中找到两个单词

时间:2012-09-19 13:32:48

标签: mysql regex

我有以下查询:

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. 

应该关注关键字fence chicken

但这不符合以下文字

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.]]'

因为正则表达式不支持随机顺序搜索,并且因为我不希望 n 能够使用关键字数量来搜索字符串,所以这是最好的解决方案。

感谢所有观看。

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式(^| )KEYWORD[- ,.:;'"!?]并将WHERE子句中的两个REGEXP测试进行AND运算。第一部分(^| )是一个正则表达式,它允许我们匹配文本的开头或空格。接下来是关键字,必须按原样匹配,然后是[]之间的字符类,该类中的单个字符必须与之匹配。对于完整的正则表达式,它就像单个字符的OR而不是|

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

免责声明:我没有测试过SQL语句,我不记得是否必须在字符串中加倍撇号。