3

我有一个 MYSQL 查询来尝试查找带连字符的单词。我正在使用 MYSQL 单词边界。

SELECT COUNT(id) 
AS count 
FROM table 
WHERE (name REGEXP '^[[<:]]some-words-with-hyphens[[:>:]]/')

这似乎有效,尽管以下内容不起作用(参见“连字符”一词后的 - )

SELECT COUNT(id) 
AS count 
FROM table 
WHERE (words REGEXP '^[[<:]]some-words-with-hyphens-[[:>:]]/')

我试图逃避 -\-但这似乎并没有改变结果。我还尝试将 - 放在 [-] 之类的括号中,但这似乎并没有改变结果。

在理解连字符将位于“单词”之内并可能位于“单词”末尾的情况下,编写此查询的正确方法是什么?

4

2 回答 2

3

正则表达式中所述:

运算符的正则表达式REGEXP可以使用以下任何特殊字符和结构:

[ deletia ]

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

    这些标记代表单词边界。它们分别匹配单词的开头和结尾。单词是前面或后面没有单词字符的单词字符序列。单词字符是alnum类中的字母数字字符或下划线 ( _)。

    mysql> SELECT 'a word a' REGEXP '[[:<:]]word[[:>:]]';    -> 1
    mysql> SELECT 'a xword a' REGEXP '[[:<:]]word[[:>:]]';   -> 0
    

由于-/都是非单词字符,因此[[:>:]]构造与它们之间的点匹配。

目前尚不清楚您为什么要使用这些构造,因为以下内容应该可以解决问题:

words REGEXP '^some-words-with-hyphens-/'

事实上,在这种情况下为什么还要使用正则表达式还不清楚,因为简单的模式匹配可以达到同样的效果:

words LIKE 'some-words-with-hyphens-/%'
于 2013-01-16T06:16:14.173 回答
0

假设这some-words-with-hyphens实际上是一个正则表达式而不是一些逐字文本,您可以简单地-在正则表达式的末尾添加一个可选项,以便匹配尾随破折号(如果存在):

WHERE (name REGEXP '^[[<:]]some-words-with-hyphens[[:>:]]-?/')

@eggyal 已经解释了为什么单词边界在该连字符之前匹配。

于 2013-01-16T06:20:09.887 回答