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'REGEXP'[[:<:]]単語[[:>:]]';    -> 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 に答える