0

MySql(私は5.1.48を使用しています)では、次の正規表現はtrueすなわちを返し1ます。

SELECT '10-5' REGEXP '10-5' as temp;
SELECT '10/5' REGEXP '10/5' as temp;
SELECT '1*5' REGEXP '1*5' as temp;

ただし、次の式はfalseieを返し0ます。

SELECT '10+5' REGEXP '10+5' as temp;
SELECT '10*5' REGEXP '10*5' as temp;

正規表現で特殊文字のリテラルインスタンスを使用するには、その前に2つの円記号(\)文字を付けます。MySQLパーサーはバックスラッシュの1つを解釈し、正規表現ライブラリはもう1つを解釈します。

エスケープする+*、前の2つのステートメントで、trueつまり1次のようになります。

SELECT '10+5' REGEXP '10\\+5' as temp;
SELECT '10*5' REGEXP '10\\*5' as temp;

この場合*、次のステートメント(最初のスニペットの最後のステートメント)でエスケープする必要がないのはなぜですか?

SELECT '1*5' REGEXP '1*5' as temp;

trueつまり1、エスケープせずに戻り*、次の類似したもの(2番目のスニペットの最後のもの)はを返しますfalse

SELECT '10*5' REGEXP '10*5' as temp;

*エスケープする必要があります。なんで?

4

1 に答える 1

2

ご存知のように、エスケープされていないアスタリスクは「前の文字が0個以上」を意味するため、「1*5」は「任意の数の1の後に5が続く」ことを意味します。

重要なのは、ドキュメントからのこの情報です。

 A REGEXP pattern match succeeds if the pattern matches anywhere in the value being tested. (This differs from a LIKE pattern match, which succeeds only if the pattern matches the entire value.)

したがって、「1 * 5」(「任意の数の1の後に5が続く」)は、「5」のみが表示されることにより、文字列「1*5」と一致します。「10*5」(「1、その後に任意の数の0、その後に5」)は、文字列「10 * 5」と一致しません。これは、「*」文字が文字列を分割するためです。

お役に立てば幸いです。

于 2012-09-11T15:50:23.363 に答える