正規表現は、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 関数を使用することも可能です。
SIMILAR TO での正規表現を使用した一致では、大文字と小文字、およびアクセント記号が区別されます。REGEXP と REGEXP_SUBSTR は、データベースの大文字と小文字、およびアクセント記号の影響を受けません。
メタ文字とは、正規表現内で特別な意味を持つ記号または文字のことです。
メタ文字の扱いは次の条件で決まります。
正規表現が使用されているのが、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 には一致しません。
|
- |
文字クラス内でハイフンを使用すると、範囲を指定できます。たとえば、 |
% |
パーセント記号は、SIMILAR TO で、任意の長さの文字列との一致に使用できます。 パーセント記号は、REGEXP および REGEXP_SUBSTR ではメタ文字として認識されません。指定されると、パーセント記号 (%) に一致します。 |
_ (アンダースコア文字) |
アンダースコア文字は、SIMILAR TO で、1 文字との一致に使用できます。 アンダースコアは、REGEXP および REGEXP_SUBSTR ではメタ文字として認識されません。指定されると、アンダースコア (_) に一致します。 |
| | パイプ記号は、文字列の一致における代替パターンの指定に使用できます。パイプ記号で区切られたパターンを持つ文字列において、パイプ記号は OR と解釈され、一致は一番左のパターンから始まり、最初の一致で停止します。したがって、パターンは重要な順にリストしてください。代替パターンはいくつでも指定できます。 |
( および ) | 左および右丸カッコは、正規表現の一部のグループ化に使用されるメタ文字です。たとえば、(ab)* は、0 回以上の ab の繰り返しに一致します。数値式と同様、グループ化を使用すると、正規表現の各部が評価される順序を制御できます。
|
{ および } |
左および右中カッコは、「量指定子」の指定に使用されるメタ文字です。量指定子では、一致を構成するためにパターンが繰り返される回数を指定します。次に例を示します。
|
\ | 円記号は、メタ文字のエスケープ文字として使用されます。また、メタ文字ではない文字のエスケープにも使用できます。 |
^ |
REGEXP と REGEXP_SUBSTR では、文字クラス外にある脱字記号は文字列の先頭に一致します。たとえば、 文字クラス内で使用された場合は、次のような動作になります。
|
$ |
REGEXP と REGEXP_SUBSTR で使用されると、文字列の末尾に一致します。たとえば、 |
. |
REGEXP と REGEXP_SUBSTR で使用されると、任意の 1 文字に一致します。たとえば、 SIMILAR TO で使用されると、ピリオド (.) に一致します。 |
: |
コロンは、サブ文字クラスを指定するために文字セット内で使用されます。たとえば、 |
「部分文字クラス」は、より大きな文字クラス内に埋め込まれた特殊文字クラスです。一致する文字のセットを定義するカスタム文字クラスのほかに (たとえば、[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:] |
現在の照合ではアルファベットの大文字と小文字に一致します。たとえば、 |
Y | ||
[:alnum:] |
現在の照合では数字およびアルファベットの大文字と小文字に一致します。たとえば、 |
Y | ||
[:digit:] |
現在の照合では数字に一致します。たとえば、 |
Y | ||
[:lower:] |
現在の照合ではアルファベットの小文字に一致します。たとえば、A は大文字なので、 |
Y | ||
[:space:] |
1 つのブランク (' ') に一致します。たとえば、次の文は、Contacts.City から 2 語で構成される名前の任意の都市を検索します。
|
Y | ||
[:upper:] |
現在の照合ではアルファベットの大文字に一致します。たとえば、 |
Y | ||
[:whitespace:] |
スペース、タブ、フォームフィード、キャリッジリターンなどのホワイトスペース文字に一致します。 |
Y | ||
[:ascii:] |
7 ビット ASCII 文字 (0 ~ 127 の序数) に一致します。 |
|||
[:blank:] |
ブランクスペースまたは水平タブに一致します。
|
|||
[:cntrl:] |
32 未満の序数または文字値 127 の ASCII 文字 (制御文字) に一致します。制御文字には、改行文字、フォームフィード、バックスペースなどが含まれます。 |
|||
[:graph:] |
出力された文字に一致します。
|
|||
[:print:] |
出力された文字とスペースに一致します。
|
|||
[:punct:] |
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~ のいずれかに一致します。
|
|||
[:word:] |
現在の照合ではアルファベット文字、数字、またはアンダースコア文字に一致します。
|
|||
[:xdigit:] |
文字クラス [0-9A-Fa-f] に含まれる文字に一致します。 |
次の構文表記規則が REGEXP 探索条件と REGEXP_SUBSTR 関数でサポートされており、円記号がエスケープ文字と認識されます。これらの表記規則は、SIMILAR TO 検索式ではサポートされません。
正規表現の構文 | 名前と意味 | ||
---|---|---|---|
\0 xxx |
値が \0xxx の文字に一致します。ここで、xxx は任意の 8 進数の並びであり、0 はゼロです。たとえば、 |
||
\a |
ベル文字に一致します。 |
||
\A |
文字セットの外側で使用し、文字列の先頭に一致します。 文字セットの外側で使用する |
||
\b |
バックスペース文字に一致します。 |
||
\B |
円記号 (\) に一致します。 |
||
\c X |
指定された制御文字に一致します。たとえば、ctrl-Z. の場合は \cZ です。 |
||
\d |
現在の照合では数字に一致します。たとえば、次の文は、Contacts.Phone から 00 で終わるすべての電話番号を検索します。
\d は、文字クラスの内側と外側の両方で使用可能で、 |
||
\D |
数字以外のものに一致します。これは、\d の反対です。 \D は、文字クラスの内側と外側の両方で使用可能で、 否定の省略形を角カッコの内側で使用する場合は、注意が必要です。 |
||
\e |
エスケープ文字に一致します。 |
||
\E | \Q によって開始されたメタ文字を非メタ文字として扱う処理を終了します。 | ||
\f |
フォームフィードに一致します。 |
||
\n |
改行に一致します。 |
||
\Q |
\E の箇所までは、すべてのメタ文字を非メタ文字として扱います。たとえば、 |
||
\r |
キャリッジリターンに一致します。 |
||
\s |
スペースまたはホワイトスペースとして扱われる文字に一致します。たとえば、次の文は、Products.ProductName から名前に 1 つ以上のスペースが含まれるすべての製品名を返します。
\s は、文字クラスの内側と外側の両方で使用可能で、 |
||
\S |
ホワイトスペース以外の文字に一致します。これは \s の反対であり、 \S は、文字クラスの内側と外側の両方で使用できます。 否定の省略形を角カッコの内側で使用する場合は、注意が必要です。 |
||
\t |
水平タブに一致します。 |
||
\v |
垂直タブに一致します。 |
||
\w |
現在の照合ではアルファベット文字、数字、またはアンダースコアに一致します。たとえば、次の文は、Contacts.Surname から 7 文字長の英数字で構成されるすべての姓を返します。
\w は、文字クラスの内側と外側の両方で使用できます。
|
||
\W |
現在の照合ではアルファベット文字、数字、またはアンダースコア以外のものに一致します。これは \w の反対であり、 この正規表現は、文字クラスの内側と外側の両方で使用できます。 |
||
\x hh |
値が 0xhh の文字に一致します。ここで、hh は 2 桁以下の 16 進数です。たとえば、 \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 GROUPO.Customers; |
次の例は、正規表現を使用してパスワードが特定のルールに準拠しているかどうかを検証します。次の文に類似したゼロ幅アサーションを使用できます。
IF password REGEXP '(?=.*[[:digit:]])(?=.*[[:alpha:]].*[[:alpha:]])[[:word:]]{4,12}' THEN 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 ) |
|
(?<! pattern ) |
|
(?> pattern ) |
|
(?: pattern ) |
|
(?# text ) | コメントに使用します。text の内容は無視されます。 |
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2013, SAP AG or an SAP affiliate company. - SAP Sybase SQL Anywhere 16.0 |