我有一个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-[[:>:]]/')
我试图用-
来逃避-,但这似乎并没有改变结果。我也试着把-放在括号里,像[-],但这似乎并没有改变结果。
在理解连字符将在"word"内并可能在"word"末尾的情况下,写这个查询的正确方法是什么?
正则表达式
REGEXP
操作符的正则表达式可以使用以下任何特殊字符和结构:
[ deletia ]
[[:<:]]
,[[:>:]]
这些标记代表单词边界。它们分别匹配单词的开头和结尾。单词是一个单词字符序列,它的前面或后面没有单词字符。单词字符是
<>之前mysql>选择"一个词"正则表达式"[[& lt;:]][[:祝辞:]]";→1mysql>选择"xword"REGEXP的[[& lt;:]][[:祝辞:]]";→0alnum
类中的字母数字字符或下划线(_
)。
由于-
和/
都是非单词字符,因此[[:>:]]
结构不匹配它们之间的点。
根本不清楚为什么要使用这些结构,因为下面的代码应该可以解决这个问题:
words REGEXP '^some-words-with-hyphens-/'
实际上,在这种情况下你甚至不清楚为什么要使用正则表达式,因为简单的模式匹配可以达到相同的效果:
words LIKE 'some-words-with-hyphens-/%'
假设some-words-with-hyphens
实际上是一个正则表达式,而不是一些逐字文本,您可以简单地在正则表达式的末尾添加一个可选的-
,以便在它存在的情况下匹配末尾的破折号:
WHERE (name REGEXP '^[[<:]]some-words-with-hyphens[[:>:]]-?/')
@eggyal已经解释了为什么单词边界在连字符之前匹配。