我有一个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-[[:>:]]/')
我试图用\-
来逃避-s,但这似乎没有改变结果。我也尝试将 - 括号括在[ - ]中,但这似乎没有改变结果。
编写此查询的正确方法是什么,理解连字符将在“单词”的内部并可能在“单词”的末尾?
答案 0 :(得分:3)
正如Regular Expressions所述:
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-/%'
答案 1 :(得分:0)
假设some-words-with-hyphens
实际上是正则表达式而不是一些逐字文本,您可以在正则表达式的末尾添加一个可选的-
,以匹配尾随的短划线(如果存在):
WHERE (name REGEXP '^[[<:]]some-words-with-hyphens[[:>:]]-?/')
@eggyal已经解释了为什么单词边界在该连字符之前匹配。