Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL リファレンス » SQL の使用 » SQL 言語の要素 »

 

正規表現の構文

正規表現は、SIMILAR TO 検索条件、REGEXP 検索条件、および REGEXP_SUBSTR 関数でサポートされています。SIMILAR TO での正規表現の構文は ANSI/ISO SQL 標準に準拠しています。REGEXP と REGEXP_SUBSTR での正規表現の構文とサポートは Perl 5 に準拠しています。

正規表現は、REGEXP と SIMILAR TO では文字列の一致に使用されますが、REGEXP_SUBSTR では部分文字列の一致に使用されます。REGEXP と SIMILAR TO で部分文字列の一致を実現するには、一致させようとしているパターンの前後にワイルドカードを指定する方法があります。たとえば、REGEXP '.*car.*' は car、carwash、vicar に一致します。また、REGEXP_SUBSTR 関数を使用するようにクエリを書き直すことも可能です。REGEXP_SUBSTR 関数 [文字列]を参照してください。

SIMILAR TO での正規表現を使用した一致では、大文字と小文字、およびアクセント記号が区別されます。REGEXP と REGEXP_SUBSTR は、データベースの大文字と小文字、およびアクセント記号の影響を受けません。LIKE、REGEXP、SIMILAR TO:文字の比較における相違点を参照してください。

正規表現:メタ文字

メタ文字とは、正規表現内で特別な意味を持つ記号または文字のことです。

メタ文字の扱いは次の条件で決まります。

  • 正規表現が使用されているのが、SIMILAR TO 探索条件または REGEXP 探索条件であるか、REGEXP_SUBSTR 関数であるか

  • メタ文字が使用されているのが、正規表現の含まれている文字クラス内部かどうか

この先を読み進む前に、「文字クラス」の定義を理解しておく必要があります。文字クラスは角カッコで囲まれた文字のセットで、文字列中の文字との一致対象になります。たとえば、構文 SIMILAR TO 'ab[1-9]' の [1-9] は文字クラスで、1 ~ 9 のいずれかの数字に一致します。正規表現でのメタ文字の扱いは、メタ文字が文字クラス内にあるかどうかで異なります。具体的には、文字クラス内に配置されたメタ文字は、そのほとんどがメタ文字としてではなく通常の文字として扱われます。

SIMILAR TO の場合 (のみ)、メタ文字 *、?、+、_、|、(、)、{ は、文字クラス内でエスケープする必要があります。

文字クラスにリテラルのマイナス記号 (-)、脱字記号 (^)、または右側の角カッコ (]) を含めるには、これらの文字をエスケープする必要があります。

サポートされている正規表現メタ文字を次に示します。ほとんどすべてのメタ文字は、SIMILAR TO、REGEXP、および REGEXP_SUBSTR で同じように扱われます。

文字 その他の情報
[]

左および右角カッコは、「文字クラス」の指定に使用されます。文字クラスとは、一致させる文字のセットです。

ハイフン (-) と脱字記号 (^) を除き、文字クラス内に指定されたメタ文字 (* など) や量指定子 ({m} など) は特別な意味を持たず、実際の文字として評価されます。

SQL Anywhere では、POSIX 文字クラスなどの部分文字クラスもサポートしています。正規表現:特殊部分文字クラスを参照してください。

* アスタリスクは、1 文字との 0 回以上の一致に使用できます。たとえば、REGEXP '.*abc' は、任意の文字列で始まって abc で終わる文字列と一致します。したがって、aabc、xyzabc、abc に一致しますが、bc や abcc には一致しません。
? 疑問符は、1 文字との 0 回または 1 回の一致に使用できます。たとえば、'colou?r' は color と colour に一致します。
+ プラス記号は、1 文字との 1 回以上の一致に使用できます。たとえば、'bre+' は bre と bree に一致しますが、br には一致しません。
-

文字クラス内でハイフンを使用すると、範囲を指定できます。たとえば、REGEXP '[a-e]' は a、b、c、d、e に一致します。

REGEXP および SIMILAR TO での範囲の評価方法の詳細については、LIKE、REGEXP、SIMILAR TO:文字の比較における相違点を参照してください。

%

パーセント記号は、SIMILAR TO で、任意の長さの文字列との一致に使用できます。

パーセント記号は、REGEXP および REGEXP_SUBSTR ではメタ文字として認識されません。指定されると、パーセント記号 (%) に一致します。

_ (アンダースコア文字)

アンダースコア文字は、SIMILAR TO で、1 文字との一致に使用できます。

アンダースコアは、REGEXP および REGEXP_SUBSTR ではメタ文字として認識されません。指定されると、アンダースコア (_) に一致します。

|

パイプ記号は、文字列の一致における代替パターンの指定に使用できます。パイプ記号で区切られたパターンを持つ文字列において、パイプ記号は OR と解釈され、一致は一番左のパターンから始まり、最初の一致で停止します。したがって、パターンは重要な順にリストしてください。代替パターンはいくつでも指定できます。

() 左および右丸カッコは、正規表現の一部のグループ化に使用されるメタ文字です。たとえば、(ab)* は、0 回以上の ab の繰り返しに一致します。数値式と同様、グループ化を使用すると、正規表現の各部が評価される順序を制御できます。
{}

左および右中カッコは、「量指定子」の指定に使用されるメタ文字です。量指定子では、一致を構成するためにパターンが繰り返される回数を指定します。次に例を示します。

  • {m}   ある 1 つの文字に正確に m 回一致します。たとえば、'519-[0-9]{3}-[0-9]{4}' は、市外局番 519 の電話番号に一致します (データが構文に定義されるフォーマットの場合)。

  • {m,}   ある 1 つの文字に少なくとも m 回一致します。たとえば、'[0-9]{5,}' は、5 桁以上の数字の文字列に一致します。

  • {m,n}   ある 1 つの文字に少なくとも m 回、ただし n 回以下、一致します。たとえば、SIMILAR TO '_{5,10}' は、5 ~ 10 文字の文字列に一致します。

\ 円記号は、メタ文字のエスケープ文字として使用されます。また、メタ文字ではない文字のエスケープにも使用できます。
^

REGEXP と REGEXP_SUBSTR では、文字クラス外にある脱字記号は文字列の先頭に一致します。たとえば、'^[hc]at' は、文字列の先頭にある hat と cat にのみ一致します。

文字クラス内で使用された場合は、次のような動作になります。

  • REGEXP および REGEXP_SUBSTR   脱字記号が文字クラスの先頭文字である場合は、その文字セットに含まれていない文字に一致します。たとえば、REGEXP '[^abc]' は、a、b、c を除く任意の 1 文字に一致します。

    脱字記号が角カッコ内の先頭文字ではない場合は、脱字記号に一致します。たとえば、REGEXP_SUBSTR '[a-e^c]' は a、b、c、d、e、^ に一致します。

  • SIMILAR TO   SIMILAR TO では、脱字記号は減算演算子として扱われます。たとえば、SIMILAR TO '[a-e^c]' は a、b、d、e に一致します。

$

REGEXP と REGEXP_SUBSTR で使用されると、文字列の末尾に一致します。たとえば、SIMILAR TO 'cat$' は cat に一致し、catfish には一致しません。

SIMILAR TO で使用されると、疑問符に一致します。

.

REGEXP と REGEXP_SUBSTR で使用されると、任意の 1 文字に一致します。たとえば、REGEXP 'a.cd' は、a で始まり cd で終わる 4 文字の文字列に一致します。

SIMILAR TO で使用されると、ピリオド (.) に一致します。

:

コロンは、サブ文字クラスを指定するために文字セット内で使用されます。たとえば、'[[:alnum:]]' のように指定します。

正規表現:特殊部分文字クラス

「部分文字クラス」は、より大きな文字クラス内に埋め込まれた特殊文字クラスです。一致する文字のセットを定義するカスタム文字クラスのほかに (たとえば、[abxq4] は一致文字のセットを a、b、x、q、4 に制限します)、SQL Anywhere では、大部分の POSIX 文字クラスなどの部分文字クラスをサポートしています。たとえば、[[:alpha:]] はすべての大文字と小文字のセットを表します。

REGEXP 探索条件と REGEXP_SUBSTR 関数では、次の表に示す構文の表記規則がすべてサポートされていますが、SIMILAR TO 検索式ではサポートされていません。SIMILAR TO でサポートされている表記規則は、「SIMILAR TO」の欄に Y と示されています。

REGEXP 内と REGEXP_SUBSTR 関数を使用する場合は、脱字記号を使用して部分文字クラスを否定できます。たとえば、[[:^alpha:]] は、アルファベット文字を除くすべての文字のセットに一致します。

部分文字クラス その他の情報 SIMILAR TO
[:alpha:]

現在の照合ではアルファベットの大文字と小文字に一致します。たとえば、'[0-9]{3}[[:alpha:]]{2}' は、3 つの数字とそれに続く 2 つの文字に一致します。

Y
[:alnum:]

現在の照合では数字およびアルファベットの大文字と小文字に一致します。たとえば、'[[:alnum:]]+' は、1 つ以上の英数字の文字列に一致します。

Y
[:digit:]

現在の照合では数字に一致します。たとえば、'[[:digit:]-]+' は、1 つ以上の数字またはダッシュの文字列に一致します。同様に、'[^[:digit:]-]+' は、数字またはダッシュ以外の 1 文字以上の文字列に一致します。

Y
[:lower:]

現在の照合ではアルファベットの小文字に一致します。たとえば、A は大文字なので、'[[:lower:]]' は A に一致しません。

Y
[:space:]

1 つのブランク (' ') に一致します。たとえば、次の文は、Contacts.City から 2 語で構成される名前の任意の都市を検索します。

SELECT City 
FROM Contacts
WHERE City REGEXP '.*[[:space:]].*';
Y
[:upper:]

現在の照合ではアルファベットの大文字に一致します。たとえば、'[[:upper:]ab]' は a または b の大文字のどれかに一致します。

Y
[:whitespace:]

スペース、タブ、フォーム・フィード、キャリッジ・リターンなどのホワイトスペース文字に一致します。

Y
[:ascii:]

7 ビット ASCII 文字 (0 ~ 127 の序数) に一致します。

[:blank:]

ブランク・スペースまたは水平タブに一致します。

[[:blank:]][ \t] と同義です。

[:cntrl:]

32 未満の序数または文字値 127 の ASCII 文字 (制御文字) に一致します。制御文字には、改行文字、フォーム・フィード、バックスペースなどが含まれます。

[:graph:]

出力された文字に一致します。

[[:graph:]][[:alnum:][:punct:]] と同義です。

[:print:]

出力された文字とスペースに一致します。

[[:print:]][[:graph:][:whitespace:]] と同義です。

[:punct:]

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ のいずれかに一致します。

[:punct:] の部分文字列クラスには、現在の照合で使用できる ASCII 以外の句読表記文字が含まれない場合があります。

[:word:]

現在の照合ではアルファベット文字、数字、またはアンダースコア文字に一致します。

[[:word:]][[:alnum:]_] と同義です。

[:xdigit:]

文字クラス [0-9A-Fa-f] に含まれる文字に一致します。

正規表現:サポートされているその他の構文表記規則

次の構文表記規則が REGEXP 探索条件と REGEXP_SUBSTR 関数でサポートされており、円記号がエスケープ文字と認識されます。これらの表記規則は、SIMILAR TO 検索式ではサポートされません。

正規表現の構文 名前と意味
\0xxx

値が \0xxx の文字に一致します。ここで、xxx は任意の 8 進数の並びであり、0 はゼロです。たとえば、\0134 は円記号に一致します。

\a

ベル文字に一致します。

\A

文字セットの外側で使用し、文字列の先頭に一致します。

文字セットの外側で使用する ^ と同義です。

\b

バックスペース文字に一致します。

\B

円記号 (\) に一致します。

\cX

指定された制御文字に一致します。たとえば、ctrl-Z. の場合は \cZ です。

\d

現在の照合では数字に一致します。たとえば、次の文は、Contacts.Phone から 00 で終わるすべての電話番号を検索します。

SELECT Surname, Surname, City, Phone
   FROM Contacts
   WHERE Phone REGEXP '\\d{8}00';

\d は、文字クラスの内側と外側の両方で使用可能で、[[:digit:]] と同義です。

\D

数字以外のものに一致します。これは、\d の反対です。

\D は、文字クラスの内側と外側の両方で使用可能で、[^[:digit:]] と同義です。

否定の省略形を角カッコの内側で使用する場合は、注意が必要です。[\D\S][^\d\s] は同じではありません。後者は、数字またはホワイトスペース以外のすべての文字に一致します。このため、後者は x に一致しますが 8 には一致しません。一方、前者は、数字以外の文字またはホワイトスペース以外の文字のいずれかに一致します。数字はホワイトスペースではなく、ホワイトスペースは数字ではないため、[\D\S] は、任意の文字、数字、ホワイトスペース、その他に一致します。

\e

エスケープ文字に一致します。

\E

\Q によって開始されたメタ文字を非メタ文字として扱う処理を終了します。

正規表現のメタ文字のリストについては、正規表現:メタ文字を参照してください。

\f

フォーム・フィードに一致します。

\n

改行に一致します。

\Q

\E の箇所までは、すべてのメタ文字を非メタ文字として扱います。たとえば、\Q[$\E\[\$ と同義です。

正規表現のメタ文字のリストについては、正規表現:メタ文字を参照してください。

\r

キャリッジ・リターンに一致します。

\s

スペースまたはホワイトスペースとして扱われる文字に一致します。たとえば、次の文は、Products.ProductName から名前に 1 つ以上のスペースが含まれるすべての製品名を返します。

SELECT Name 
FROM Products
WHERE Name REGEXP '.*\\s.*'

\s は、文字クラスの内側と外側の両方で使用可能で、[[:whitespace:]] と同義です。正規表現:特殊部分文字クラスを参照してください。

\S

ホワイトスペース以外の文字に一致します。これは \s の反対であり、[^[:whitespace:]] と同義です。

\S は、文字クラスの内側と外側の両方で使用できます。正規表現:特殊部分文字クラスを参照してください。

否定の省略形を角カッコの内側で使用する場合は、注意が必要です。[\D\S][^\d\s] は同じではありません。後者は、数字またはホワイトスペース以外のすべての文字に一致します。このため、後者は x に一致しますが 8 には一致しません。一方、前者は、数字以外の文字またはホワイトスペース以外の文字のいずれかに一致します。数字はホワイトスペースではなく、ホワイトスペースは数字ではないため、[\D\S] は、任意の文字、数字、ホワイトスペース、その他に一致します。

\t

水平タブに一致します。

\v

垂直タブに一致します。

\w

現在の照合ではアルファベット文字、数字、またはアンダースコアに一致します。たとえば、次の文は、Contacts.Surname から 7 文字長の英数字で構成されるすべての姓を返します。

SELECT Surname 
FROM Contacts 
WHERE Surname REGEXP '\\w{7}';

\w は、文字クラスの内側と外側の両方で使用できます。正規表現:特殊部分文字クラスを参照してください。

[[:alnum:]_]. と同義です。

\W

現在の照合ではアルファベット文字、数字、またはアンダースコア以外のものに一致します。これは \w の反対であり、[^[:alnum:]_] と同義です。

この正規表現は、文字クラスの内側と外側の両方で使用できます。正規表現:特殊部分文字クラスを参照してください。

\xhh

値が 0xhh の文字に一致します。ここで、hh は 2 桁以下の 16 進数です。たとえば、\x2D はハイフンと同義です。

\x{hh} と同義です。

\x{hhh}

値が 0xhhh の文字に一致します。ここで、hhh は 8 桁以下の 16 進数です。

\z\Z

文字列の末尾の位置 (文字ではない) に一致します。

$ と同義です。

正規表現:アサーション

アサーションは、条件が true かどうかをテストし、文字列内の一致が開始される位置に影響します。アサーションは文字を返しません。最終的な一致にはアサーションのパターンは含まれません。これらのアサーションは、REGEXP 探索条件と REGEXP_SUBSTR 関数でサポートされています。これらの表記規則は、SIMILAR TO 検索式ではサポートされません。

REGEXP_SUBSTR で文字列を分割する場合は、先読みアサーションと後読みアサーションが便利です。たとえば、次の文を実行すると、Customers テーブルの Address カラムに含まれる街路名のリストを (街路番号を付けずに) 返すことができます。

SELECT REGEXP_SUBSTR( Street, '(?<=^\\S+\\s+).*$' ) 
FROM Customers;

次の例は、正規表現を使用してパスワードが特定の規則を満たしていることを確認する場合を示します。次の文に類似したゼロ幅アサーションを使用できます。

IF password REGEXP '(?=.*[[:digit:]])(?=.*[[:alpha:]].*[[:alpha:]])[[:word:]]{4,12}' 
   MESSAGE 'Password conforms' TO CLIENT;
ELSE
   MESSAGE 'Password does not conform' TO CLIENT;
END IF

次の条件を満たす場合、パスワードは有効です。

  • password に 1 つ以上の数字が含まれている ([[:digit:]] を使用したゼロ幅の正のアサーション)

  • password に 2 つ以上のアルファベット文字が含まれている ([[:alpha:]].*[[:alpha:]] を使用したゼロ幅の正のアサーション)

  • password に英数字またはアンダースコア文字のみが含まれている ([[:word:]])

  • password が 4 文字以上で 12 文字以下である ({4,12})

次の表は、SQL Anywhere でサポートされているアサーションを示します。

構文 意味
(?=pattern)

正の先読みゼロ幅アサーション   一致文字列に pattern を含めないで、文字列内の現在位置のすぐ後ろに pattern があるかどうかを調べます。'A(?=B)' は、後ろに B が続く A に一致します。B は一致に含まれません。

たとえば、SELECT REGEXP_SUBSTR( 'in new york city', 'new(?=\\syork)'); は、部分文字列 new の後ろに ' york' (スペースの後ろに york があります) が続く場合に、new を返します。

(?!pattern)

負の先読みゼロ幅アサーション   文字列内の現在位置のすぐ後ろに patternないかどうかを調べます。一致文字列に pattern は含まれません。したがって、'A(?!B)' は、後ろに B が続かない A に一致します。

たとえば、SELECT REGEXP_SUBSTR('new jersey', 'new(?!\\syork)'); は、部分文字列 new を返します。

(?<=pattern)

正の後読みゼロ幅アサーション   一致文字列に pattern を含めないで、文字列内の現在位置のすぐ前に pattern があるかどうかを調べます。したがって、'(?<=A)B' は、すぐ前に A がある B に一致します。A は一致に含まれません。

たとえば、SELECT REGEXP_SUBSTR('new york', '(?<=new\\s)york'); は、部分文字列 york を返します。

(?<!pattern)

負の後読みゼロ幅アサーション   文字列内の現在位置のすぐ前に patternないかどうかを調べます。一致文字列に pattern は含まれません。

たとえば、SELECT REGEXP_SUBSTR('about york', '(?<!new\\s)york'); は、部分文字列 york を返します。

(?>pattern)

所有ローカル部分式   pattern に一致する残りの文字列の最大プレフィクスにのみ一致します。

たとえば、'aa' REGEXP '(?>a*)a' では、(?>a*) は 先行の a にのみ一致するのではなく、aa に一致 (つまり、条件の評価対象全体に一致) します。このため、'aa' REGEXP '(?>a*)a' は、false と評価されます。

(?:pattern)

非取得ブロック   これは、機能的には単なる pattern と同じであり、互換性を保つために提供されています。

たとえば、'bb' REGEXP '(?:b*)b' では、(?:b*) は bb に一致 (つまり、条件の評価対象全体に一致) します。ただし、所有ローカル部分式とは異なり、bb の最後の b は解放され、全体の一致が続行されます (つまり、非取得ブロックの外側に指定されている b との一致が可能)。

同様に、'a(?:bc|b)c' は abcc と abc に一致します。abc との一致の場合は、bc の最後の c でバックトラックが実行され、グループの外側にある c が使用されて一致が成功します。

(?#text)

コメントに使用します。text の内容は無視されます。

参照