【问题标题】:Ignore common words (the, and) in MySQL REGEXP query忽略 MySQL REGEXP 查询中的常用词 (the, and)
【发布时间】:2011-04-07 15:29:35
【问题描述】:

我正在尝试根据书名的第一个字母查询书名数据库。但是,我想忽略“The”和“A”等常用词。

所以在搜索以字母“T”开头的书籍时

"The Adventures of Huck Finn" - would NOT be matched
"Transformation of a Runner" - would be matched

我对 REGEX 不是很有经验,但这是我目前所拥有的(其中 $first_letter 可能等于 't')

... WHERE title = '^[(a )(the )]*[$first_letter]' ...

即使在单词“A”或“The”之后,这也会成功匹配以特定字母开头的书名,但不会忽略这些单词。所以如果 $first_letter='t',它会匹配上面提到的两本书。

我试过谷歌搜索,但没有找到任何解决方案。任何帮助将不胜感激。

提前致谢。

凯文

【问题讨论】:

    标签: php mysql regex


    【解决方案1】:

    【讨论】:

    • 我希望 Mysql(或者我现在猜是 Oracle)能够摆脱他们的懒惰并为 InnoDB 表添加全文支持。不过现在不太可能发生。 Oracle 不希望 MySQL 变得“更好”。
    【解决方案2】:

    您编写的正则表达式无效。 []s 用于表示所谓的字符类。您在括号中输入的所有内容(可能需要转义一些字符,例如文字字符[])都被视为单个字符的替代。

    edit 重新阅读我的答案后,我意识到 lookaround 并不是解决这个问题的好方法。

    您正在探索的功能称为 negative lookaheadnegative lookbehind 或一些类似的变体。我不确定 MySQL 的正则表达式是否支持它,但我认为它不适合解决这个问题。

    或者,您可以执行如下所示的正则表达式:

    ^((a|the|of|and) )?[letter of interest]
    

    细分:

    • 有两组
      • 最里面的组查找您要忽略的单词实例
      • 最外面的组只是在末尾添加一个空格
    • ? 断言该组可能存在 01 实例

    您必须自己完成将其转换为 MySQL 正则表达式语法的工作。我很抱歉。

    【讨论】:

    • 感谢您的回复!您在“细分”中描述的正是我想要做的,我只是不知道如何在正则表达式中构造它。这就是我最终使用的:^((a|the|of|and) )*[letter of intrest]
    • @KevinJantzer 我知道这很长时间了,但你还记得你是如何做到这一点的吗?我遇到了同样的要求,我们想排除“the”“and”等词。请帮忙?
    • @A.Raza - 我现在使用 mysql 全文搜索,这在很大程度上解决了我的问题。我使用的另一种方法是在保存标签/标题时,我还保存了第二个版本,其中去除了不需要的单词(可选的标点符号)。
    猜你喜欢
    • 2012-09-22
    • 1970-01-01
    • 2013-02-11
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多