我正在编写一个(相当基本的)搜索工具,我正在使用此正则表达式来匹配搜索查询:
SELECT * FROM table WHERE field REGEXP '[[:<:]]foo[[:>:]]'
我正在搜索一列带名,其中一个在系统中为“D.O.A.”。搜索d.o.a.
(在任何一种情况下)都不会返回匹配项,但搜索d.o.a
(注意:没有最终尾随句点)会返回正确的匹配项。我可以对这个正则表达式进行简单的调整,它会返回正确的行,还是应该重新开始另一个?
编辑:根据要求,这是使用的实际搜索:
SELECT * FROM bands WHERE band_name REGEXP '[[:<:]]d.o.a.[[:>:]]'
答案 0 :(得分:2)
[[:&lt;:]],[[:&gt;:]]
这些标记代表字边界。他们匹配开头和 词尾,分别。一个单词是一系列单词字符 不在单词字符之前或之后的单词字符。 一个字 character是alnum类中的字母数字字符或 下划线(_)。
(强调我的)
句点.
不是单词字符,因此您无法匹配单词后面的单词结尾。不幸的是,没有简单的方法来修复你的正则表达式,除非你能够准确地告诉我们你认为是单词边界。如果它是空格,就像
SELECT * FROM table WHERE field REGEXP '[[:space:]]foo[[:space:]]'
会工作吗?或者,如果我正确地阅读规范:
SELECT * FROM table WHERE field REGEXP '[[:space:][:punct:]]foo[[:space:][:punct:]]'
将使用空格和标点符号。虽然
SELECT * FROM table WHERE field REGEXP '[^[:alnum:]_]foo[^[:alnum:]_]'
可能是你最接近的。
编辑:刚才意识到您也将尝试匹配列的开头或结尾:
SELECT * FROM table WHERE field REGEXP '(^|[^[:alnum:]_])foo([^[:alnum:]_]|$)'
将检查字符串(^)和结束($)的开头。
答案 1 :(得分:0)
你需要逃避 .使用 REGEXP 时。采用 \。代替 。 这 。字符用于匹配任何单个字符。 修正版:
SELECT * FROM bands WHERE band_name REGEXP '[[:<:]]d\.o\.a\.[[:>:]]'