0

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

SELECT * FROM table WHERE field REGEXP '[[:<:]]foo[[:>:]]'

我正在搜索一列乐队名,其中一个在系统中为“DOA”。搜索d.o.a.(在任何一种情况下)都不会返回匹配项,但搜索d.o.a(注意:没有最后的尾随句点)会返回正确的匹配项。我可以对这个正则表达式进行简单的调整,它会返回正确的行,还是我应该从另一个开始?

编辑:根据要求,这是正在使用的实际搜索:

SELECT * FROM bands WHERE band_name REGEXP '[[:<:]]d.o.a.[[:>:]]'
4

2 回答 2

2

规范

[[:<:]], [[:>:]]

这些标记代表单词边界。它们分别匹配单词的开头和结尾。单词是前面或后面没有单词字符的单词字符序列。单词字符是 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:]_]|$)'

将检查字符串的开头 (^) 和结尾 ($)。

于 2013-08-05T21:03:26.340 回答
0

你需要逃避 . 使用 REGEXP 时。利用 \。代替 。这 。字符用于匹配任何单个字符。修正版:

   SELECT * FROM bands WHERE band_name REGEXP '[[:<:]]d\.o\.a\.[[:>:]]'
于 2021-06-09T20:04:14.493 回答