3

mySQL の列内で '[sometext<someothertext>]' (つまり、左角かっこ、テキスト、左山かっこ、テキスト、右山かっこ、右角かっこ) のような文字列を一致させようとしています。もともと私は次のクエリを使用していました (正規表現クエリは mySQL で 2 回エスケープされるため、通常 1 つを使用するところに 2 つのバックスラッシュを使用する必要があることに注意してください)。

SELECT * FROM message WHERE msgtext REGEXP '\\[(.+)?<(.+)?>\\]'

このクエリはエラーを受け取りませんでしたが、望ましくないものが返されました。(.+) の代わりに、[^\]] (右角かっこ以外のすべてに一致) が必要でした。クエリを変更すると、次のエラーが表示されました。

ここでmySQL ドキュメントを読んだ後、「リテラル ] 文字を含めるには、開始ブラケット [. 「]」の代わりに「^\]」が必要なので、ブラケットを左ブラケットの後の最初の文字にすることはできないため、これは可能ですか? 以下は、上記と同じエラーが発生する、私が試したクエリの一部です。

SELECT * FROM message WHERE msgtext REGEXP '\\[([^\\]]+?)<([^\\]]+?)>\\]'
SELECT * FROM message WHERE msgtext REGEXP '\\[[^\\]]+?<[^\\]]+?>\\]'
SELECT * FROM message WHERE msgtext REGEXP '\\[[^[.right-square-bracket.]]]+?<[^[.right-square-bracket.]]]+?>\\]'

アップデート:

次のクエリはエラーなしで実行されますが、探しているものと一致する列があることがわかっているにもかかわらず、行が返されません (最初のクエリに基づいて)。

SELECT * FROM message WHERE msgtext REGEXP '\\[([^\\]]+)?<([^\\]]+)?>\\]'
4

2 に答える 2

6

これは私のために働きます:

SELECT '[sometext<someothertext>]' REGEXP '\\[([^[.right-square-bracket.]]+)?<([^[.right-square-bracket.]]+)?>\\]$';
于 2009-06-05T17:37:32.890 に答える
0

スラッシュがエスケープされていない場合、最終的な正規表現は正しく見え、Firefox/JS で機能します。ただし、MySQL がキャプチャ グループをネイティブにサポートしているようには見えません...おそらくそれが問題です。

おそらくこれは役に立つでしょう: http://mysqludf.com/lib_mysqludf_preg/

また、+ の代わりに * を試すこともできますか? あなたの否定された右の正方形のために。

* は 0 回以上の繰り返し (貪欲) を意味します
+? 1回以上の繰り返しを意味します(怠惰)

于 2009-06-05T17:25:32.907 に答える