MySQL:使用REGEX匹配字符串末尾的句点字符

时间:2013-08-05 20:53:37

标签: mysql regex

我正在编写一个(相当基本的)搜索工具,我正在使用此正则表达式来匹配搜索查询:

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

2 个答案:

答案 0 :(得分:2)

来自Specification

  

[[:&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\.[[:>:]]'