正規表現
InterSystems IRIS® データ・プラットフォームでは、ObjectScript 関数の $LOCATE と $MATCH、および %Regex.MatcherOpens in a new tab クラスのメソッドで使用する正規表現がサポートされています。
その他すべての部分文字列マッチング処理では、ObjectScript パターン・マッチング演算子を使用します。
正規表現の InterSystems IRIS 実装は、正規表現の International Components for Unicode (ICU) 標準に基づきます。Perl 正規表現に精通したユーザは、InterSystems IRIS 実装に多くの類似点を見い出します。
ワイルドカードと修飾子
ワイルドカード。行スペース文字の $CHAR(10)、$CHAR(11)、$CHAR(12)、$CHAR(13)、および $CHAR(133) を除いて、任意のタイプの任意の 1 文字と一致します。単一行モード (?s) を指定すると、行スペース文字の除外をオーバーライドできます (このリファレンス・ページで後述)。
単独で使用できます。..は、任意の 2 文字を表すために使用できます。また、\d.. という組み合わせで、任意の 2 文字が続く 1 つの数字を表すために使用できます。
接尾語との組み合わせができますが、同じ行スペース文字制限があります。
-
.? は、任意のタイプの 0 文字か 1 文字と一致します。
-
.*は、任意のタイプの 0 文字以上の文字と一致します。
-
.+ は、任意のタイプの 1 文字以上の文字と一致します。
-
.{3} は、任意のタイプの 3 文字と一致します。
ワイルドカードのシーケンスを終了するには、円記号 (\) 接頭語を使用して次のリテラルをエスケープ処理します。例えば、regexp ".*\H\d{2}" は、英字の H の後に 2 桁の数字で終わる、任意のタイプの任意の文字の文字列と一致します。
単一文字接尾語 (0 または 1)。regexp を 1 回または0 回 string に適用します。正規表現の \d?、[0–9]?、または [[:digit:]]? はすべて、単一の数字か空の文字列に一致します。正規表現の .?(log) は blog (1 回の出現) または log (0 回の出現) に一致します。正規表現 abc? は abc または ab のいずれかに一致できます。
反復接尾語 (1 回以上)。regexp を 1 回以上 string に適用します。例えば、A+ は文字列の AAAAA に一致します。.+ は、任意の文字タイプの任意の長さの文字列に一致しますが、空の文字列には一致しません。正規表現の \d+、[0–9]+、または [[:digit:]]+ はすべて、任意の長さの数字の文字列に一致します。
括弧を複雑な反復パターンで使用できます。例えば、(AB)+ は文字列の ABABABAB に一致します。(\d\d\d\s)+ は、3 桁の数字と単一のスペース文字が交互に続く任意の長さのシーケンスに一致します。
反復接尾語 (0 回以上)。regexp を 0 回以上 string に適用します。例えば、A* は文字列の A、AAAAA、および空の文字列に一致します。.* は、空の文字列を含めて、任意の文字タイプの任意の長さの文字列に一致します。正規表現の \d*、[0–9]*、または [[:digit:]]* はすべて、空の文字列または任意の長さの数字の文字列に一致します。
括弧を複雑な反復パターンで使用できます。例えば、(AB)* は文字列の ABABABAB に一致します。(\d\d\d\s)* は、3 桁の数字と単一のスペース文字が交互に続く任意の長さのシーケンスに一致します。
数量化接尾語 (n 回)。{n} 接尾語により regexp を正確に n 回適用します。例えば、\d{5} は、5 桁の数字に一致します。
数量化接尾語 (n 回以上)。{n,} 接尾語により regexp を n 回以上適用します。例えば、\d{5,} は、5 桁以上の数字に一致します。
数量化接尾語 (範囲)。{n,m} 接尾語により regexp を n 回以上、m 回以下適用します。例えば\d{7,10} は、7 桁以上で 10 桁以下の数字に一致します。
リテラルと文字の範囲
大半のリテラル文字は単純に正規表現に含めることができます。例えば、正規表現の ".*G.*" は、文字列に英字の G が含まれている必要があることを指定します。
また、一部のリテラル文字は正規表現のメタ文字としても使用されます。リテラル文字として扱うメタ文字の前には、エスケープ接頭語 (円記号文字) を使用する必要があります。ドル記号 \$、アスタリスク \*、プラス記号 \+、ピリオド \.、疑問符 \?、円記号 \\、キャレット \^、垂直バー \|、開始括弧と終了括弧 \( \)、開始角括弧と終了角括弧 \[ \]、および開始中括弧と終了中括弧 \{ \} のリテラル文字では、エスケープ接頭語が必要です。終了角括弧の ] では、常にエスケープ接頭語が必要なわけではありません。エスケープ接頭語は、明確にしたり整合性のために使用する必要があります。
引用符文字ではエスケープ接頭語を使用しません。リテラル引用符文字を使用するには、二重引用符 "" にします。
以下に、リテラルの複数の正規表現一致を指定する方法を示します。
指定文字または文字のリスト。したがって [A] は、英字の大文字の A のみに一致することを意味します。[ACE] は、英字の A、C、または E のいずれか 1 つと一致します。文字は任意の順序で記述できます。繰り返し文字が可能です。キャレット (^) を使用すると、否定を指定できます。例えば、[^A] は、英字の大文字の A を除いた任意の文字に一致することを意味します。[^XYZ] は、X、Y、または Z を除いた任意の文字に一致することを意味します。既定では、これらの文字の一致では大文字と小文字が区別されます。(?i) モード修飾子を前に付加すると、文字の一致で大文字と小文字が区別されないようにできます。
キャレット (^) をリテラル一致文字として指定するために、リストの最初の文字にすることはできません。ハイフン ($CHAR(45)) をリテラル一致文字として指定するには、リストで最初か最後の文字にする必要があります。終了角括弧 (]) をリテラル一致文字として指定するには、リストで最初の文字にする必要があります。(最初の文字は、^ 否定演算子後の最初の文字を意味する場合があります。)円記号エスケープ接頭語リテラルも使用できます。例えば、[\\AB\[CD] は、円記号 (\)、開始角括弧 ([)、および英字の A、B、C、および D に一致します。
x で始まり、z で終わる指定文字の範囲。一般的には英字や数字に使用されますが、昇順の任意の ASCII シーケンスを範囲として使用することができます。したがって、[A-Z] はすべての大文字の範囲です。[A-z] は、英字の大文字と小文字だけでなく、英字における 6 つの ASCII 句読点文字も含まれる範囲です。昇順の ASCII シーケンスでない範囲を指定すると、<REGULAR EXPRESSION> エラーが発生します。また、複数の範囲を指定することもできます。したがって、[A-Za-z] はすべての大文字と小文字の範囲です。開始括弧に続く最初の文字としてキャレット (^) を使用すると、否定を指定できます。例えば、[^A-F] は、A ~ F の文字以外の文字すべてに一致します。キャレットは、指定されているすべての範囲の否定を指定するので、[^A-Za-z] は英文字を除くすべての文字に一致します。文字の範囲と単一文字のリストは、任意のシーケンスで組み合わせられます。したがって、[ABCa-fXYZ0-9] は、指定文字と指定範囲内の文字に一致します。
OR 論理演算子 (|) で区切られた指定された文字列または文字列のリスト。したがって、(William) は string 内のこの部分文字列に一致し、(William|Willy|Wm\.|Bill) はこれらの部分文字列のいずれかに一致します。エスケープ接頭語の \| を使用すると、垂直バーを文字列内のリテラルとして指定できます。既定では、これらの部分文字列の一致では大文字と小文字が区別されます。(?i) モード修飾子を前に付加すると、部分文字列の一致で大文字と小文字が区別されないようにできます。既定では、これらの部分文字列一致は string 内の任意の場所で可能です。\b を前に付加すると、部分文字列の一致が単語境界で発生するように制限できます。
文字タイプ・メタ文字
InterSystems IRIS の正規表現では、3 セットの文字タイプ・メタ文字がサポートされています。
-
単一文字タイプ。例えば、\d のようになります。
-
Unicode プロパティ文字タイプ。例えば、\p{LL} のようになります。
-
POSIX 文字タイプ。例えば、[:alpha:] のようになります。
これらの文字タイプ・メタ文字は、任意の正規表現で任意に組み合わせて使用できます。
単一文字タイプ
単一文字タイプ・メタ文字は、円記号 (\) とその後の英字で示します。文字タイプは小文字で指定されます (\d = 数字 : 0 ~ 9)。これらの文字タイプで否定をサポートしている場合、大文字により文字タイプの否定を指定します (\D = 数字を除いた任意の文字)。
ベル文字 $CHAR(7)。否定はサポートされていません。
数字。0 ~ 9。否定は \D です。
エスケープ文字 $CHAR(27)。否定はサポートされていません。
書式送り文字 $CHAR(12)。否定はサポートされていません。
改行文字 $CHAR(10)。否定はサポートされていません。
キャリッジ・リターン文字 $CHAR(13)。否定はサポートされていません。
スペース文字。$CHAR(9)、$CHAR(10)、$CHAR(11)、$CHAR(12)、$CHAR(13)、$CHAR(32)、$CHAR(133)、および $CHAR(160) を含めた、空白、タブ、または行スペースの文字。否定は \S です。
タブ文字 $CHAR(9)。否定はサポートされていません。
単語構成文字。単語構成文字は、文字、数字、またはアンダースコア文字を使用できます。有効な文字には、Unicode 文字を含めて英字の大文字と小文字が含まれます。これらには、$CHAR(170)、$CHAR(181)、$CHAR(186)、$CHAR(192) ~ $CHAR(214)、$CHAR(216) ~ $CHAR(246)、$CHAR(248) ~ $CHAR(256) の拡張 ASCII 文字が含まれます。否定は \W です。
\d、\s、および \w のメタ文字は、$CHAR(256) よりも後の適切な Unicode 文字にも一致します。
その他の個々の制御文字のメタ文字シーケンスについては、"制御文字表現" を参照してください。
Unicode プロパティ文字タイプ
Unicode プロパティ文字タイプの一致では、単一文字が以下の構文を使用して指定された文字タイプに一致します。
\p{prop}
例えば、\p{LL} は、英字の小文字に一致します。prop キーワードは、1 文字または 2 文字の文字で構成されます。prop キーワードでは、大文字と小文字は区別されません。単一文字の prop キーワードは、最も包含的です。2 文字の prop キーワードはサブセットを指定します。
否定は \P{prop} です。例えば、\P{LL} は、小文字でない任意の文字に一致します。
以下のリストは、最初の 256 文字で各 prop キーワードに一致する文字を示しています (256 文字のいずれにも一致しない prop キーワードには、サンプルの Unicode 文字が示されています)。
制御文字とその他の文字 (0-31、127-159、173)
制御文字 (0-31、127-159)
書式設定文字 (173)
割り当てられていないコード・ポイント (例えば、888)
非公開使用文字 (例えば、57344)
サロゲート(例えば、55296)
英字 (65-90、97-122、170、181、186、192-214、216-246、248-255)
英字の小文字 (97-122、170、181、186、223-246、248-255)
修飾子文字 (例えば、688)
LL、LU、LT、または LM 以外の文字 (例えば、443)
タイトル文字 (例えば、453)
英字の大文字 (65-90、192-214、216-222)
記号 (例えば、768)
修飾文字 (例えば、2307)
囲み記号 (例えば、1160)
アクセント記号 (例えば、768)
数字 (48-57、178-179、185、188-190)
10 進数 (48-57)
数値を表す文字 (例えば、5870)
数字の添え字と小数 (178-179、185、188-190)
句読点 (33-35、37-42、44-47、58-59、63-64、91-93、95、123、125、161、171、183、187、191)
接続句読点 (95)
ダッシュ (45)
終了句読点 (41、93、125)
開始句読点 (40、91、123)
最初の句読点 (171)
最後の句読点 (187)
その他の句読点 (33-35、37-39、42、44、46-47、58-59、63-64、92、161、183、191)
記号 (36、43、60-62、94、96、124、126、162-169、172、174-177、180、182、184、215、247)
通貨記号 (36、162-165)
組み合わせ記号 (94、96、168、175、180、184)
算術記号 (43、60-62、124、126、172、177、215、247)
その他の記号 (166-167、169、174、176、182)
区切り文字 (32、160)
行区切り文字 (例えば、8232)
パラグラフ区切り文字 (例えば、8233)
空白文字 (32、160)
以下のコードを使用すると、prop キーワードで一致する文字を判別できます。
READ prop#2:10
READ rangefrom:10
READ rangeto:10
FOR i=rangefrom:1:rangeto {
IF $MATCH($CHAR(i),"\p{"_prop_"}")=1 {
WRITE i,"=",$CHAR(i),!} }
POSIX 文字タイプ
POSIX 構文では、単一文字が以下の構文形式のいずれかを使用して ptype キーワードで指定された文字タイプに一致します。
\p{ptype}
[:ptype:]
例えば、[:lower:] や \p{lower} は、英字の小文字に一致します。[:^lower:] や \P{lower} のようにすると否定 (英字の小文字以外のすべてに一致) を指定できます。
ptype キーワードでは、大文字と小文字は区別されません。一般的な ptype キーワードは、以下のとおりです。
-
alnum — 文字と数字。
-
alpha — 文字。
-
blank — タブ ($CHAR(9)) またはスペース (CHAR(32)、CHAR(160))。
-
cntrl — 制御文字 ($CHAR(0) ~ $CHAR(31)、$CHAR(127) ~ $CHAR(159))。
-
digit — 数字 (0 ~ 9)。
-
graph — スペース文字を除く出力可能文字 ($CHAR(33) ~ $CHAR(126)、$CHAR(161) ~ $CHAR(156))。
-
lower — 英字の小文字。
-
math — 算術文字 (記号のサブセット)。+<=>^|~¬±×÷ の文字が含まれます。
-
print — スペース文字を含む出力可能文字 ($CHAR(32) ~ $CHAR(126)、$CHAR(160) ~ $CHAR(156))。
-
punct — 句読点文字 (記号文字を除きます)。!"#%&'()*,-./:;?@[\]_{}¡«·»¿ の文字が含まれます。
-
space — $CHAR(9)、$CHAR(10)、$CHAR(11)、$CHAR(12)、$CHAR(13)、$CHAR(32)、$CHAR(133)、および $CHAR(160) の文字を含む、空白、タブ、および行スペースの文字を含めた、スペース文字。
-
symbol — 記号文字 (句読点文字を除きます)。$+<=>^`|~¢£¤¥¦§¨©¬®¯°±´¶¸×÷ の文字が含まれます。
-
upper — 英字の大文字。
-
xdigit — 16 進数。0 ~ 9 の数字、A ~ F の大文字、および a ~ f の小文字です。
さらに、ptype を使用すると、Unicode カテゴリを指定できます。例えば、[:greek:] は、Unicode ギリシャ語カテゴリ ($CHAR(900) ~ $CHAR(974) の範囲にあるギリシャ文字がこれに含まれます) の文字に一致します。これらの POSIX Unicode カテゴリの部分リストには、[:arabic:]、[:cyrillic:]、[:greek:]、[:hebrew:]、[:hiragana:]、[:katakana:]、[:latin:]、[:thai:] が含まれます。これらの Unicode カテゴリは、例えば [:script=greek:] としても表記できます。
以下の例では、POSIX マッチングを使用して、[:letter:] 文字セットと [:latin:] 文字セットを最初の 256 文字で比較します。それらは、文字が 1 つ ($CHAR(181)) 異なります。
FOR i=0:1:255 {
SET letr="foo"
IF 1=$MATCH($CHAR(i),"[:letter:]") {
SET letr=$CHAR(i)}
IF 1=$MATCH($CHAR(i),"[:latin:]") {
SET lat=$CHAR(i)}
ELSE {SET lat="foo"}
IF letr '= lat {WRITE i," ",$CHAR(i),!}
}
グループ化構文
括弧を使用すると、繰り返し適用されるリテラルやメタ文字シーケンスを指定できます。例えば、正規表現 ([0–9])+ では、文字列内の各連続文字が数字かどうかテストします。
この使用法は、以下の例を参照してください。
WRITE $MATCH("4567683285759","([0-9])+"),!
// test for all numbers, no empty string
WRITE $MATCH("4567683285759","([0-9])*"),!
// test for all numbers or for empty string
WRITE $MATCH("Now is the time","\p{LU}(\p{L}|\s)+"),!
// test for initial uppercase letter, then all letters or spaces
WRITE $MATCH("MAboston-9a","\p{LU}{2}(\p{LL}|\d|\-)*"),!
// test for 2 uppercase letters, then all lowercase, numbers, dashes, or ""
WRITE $MATCH("1^23^456^789","([0-9]+\^?)+"),!
// test for one or more numbers followed by 0 or 1 ^ characters, apply test repeatedly
WRITE $MATCH("$1,234,567,890.99","\$([0-9]+,?)+\.\d\d")
// test for $, then numbers followed by 0 or 1 comma, then decimal point, then 2 fractional digits
グループ化構文は正規表現を繰り返して適用するので、所要時間の長いマッチング処理を作成できます。
以下の例は注意が必要で、文字列のパターン一致エラーの位置に応じて、繰り返して適用されるグループ化構文の実行時間が急激に長くなります。不一致を宣言する前にテストが必要な組み合わせの数が増加すると、実行時間が長くなります。
SET a=$ZHOROLOG
WRITE $MATCH("1111111111,2222222222,3333333333","([0-9]+,?)+")
SET b=$ZHOROLOG-a
WRITE " duration: ",b,!
SET a=$ZHOROLOG
WRITE $MATCH("11111x11111,2222222222,3333333333","([0-9]+,?)+")
SET b=$ZHOROLOG-a
WRITE " duration: ",b,!
SET a=$ZHOROLOG
WRITE $MATCH("1111111111,22x22222222,3333333333","([0-9]+,?)+")
SET b=$ZHOROLOG-a
WRITE " duration: ",b,!
SET a=$ZHOROLOG
WRITE $MATCH("1111111111,2222222x222,3333333333","([0-9]+,?)+")
SET b=$ZHOROLOG-a
WRITE " duration: ",b,!
SET a=$ZHOROLOG
WRITE $MATCH("1111111111,22222222x22,3333333333","([0-9]+,?)+")
SET b=$ZHOROLOG-a
WRITE " duration: ",b
アンカー・メタ文字
アンカーとは、関連する正規表現一致を一致文字列内の特定の場所に制限するメタ文字です。例えば、一致する場所を、文字列の先頭や最後、または文字列内のスペース文字の後のみにすることができます。
文字列の先頭または最後
これらのアンカーにより、文字列の先頭や最後に一致が制限されます。
文字列の先頭のアンカー接頭語。正規表現の一致が文字列の先頭で出現する必要があることを示します。
文字列の最後のアンカー接尾語。正規表現の一致が文字列の最後に出現する必要があることを示します。行の最後の文字 (ASCII 10、11、12、または 13) は無視されます。\Z と同じです。
文字列の最後のアンカー接尾語。正規表現の一致が文字列の最後に出現する必要があることを示します。行の最後の文字 (ASCII 10、11、12、または 13) は無視されます。$ と同じです。
文字列の最後のアンカー接尾語。正規表現の一致が文字列の最後に出現する必要があることを示します。行の最後の文字 (ASCII 10、11、12、または 13) は一致のための文字列として扱われます。
以下の例は、文字列の先頭アンカーにより $LOCATE 一致を制限する方法を示しています。
SET str="ABCDEFG"
WRITE $LOCATE(str,"A"),! // returns 1
WRITE $LOCATE(str,"D"),! // returns 4
WRITE $LOCATE(str,"^A"),! // returns 1
WRITE $LOCATE(str,"^D"),! // returns 0 (no match)
以下の例は、文字列の最後アンカーにより $LOCATE 一致を制限する方法を示しています。
SET str="ABCDABCD"
WRITE $LOCATE(str,"(ABC)"),! // returns 1
WRITE $LOCATE(str,"D"),! // returns 4
WRITE $LOCATE(str,"(ABC)$"),! // returns 0 (no match)
WRITE $LOCATE(str,"(ABCD)$"),! // returns 5
WRITE $LOCATE(str,"D$"),! // returns 8
以下の例は、文字列最後のアンカーで改行文字がどのように扱われるかを示しています。
SET str="ABCDEFG"_$CHAR(10)
WRITE $LOCATE(str,"G$"),! // returns 7
WRITE $LOCATE(str,"G"_$CHAR(10)_"$"),! // returns 7
WRITE $LOCATE(str,$CHAR(10)_"$"),!! // returns 8
WRITE $LOCATE(str,"G\Z"),! // returns 7
WRITE $LOCATE(str,"G"_$CHAR(10)_"\Z"),! // returns 7
WRITE $LOCATE(str,$CHAR(10)_"\z"),!! // returns 8
WRITE $LOCATE(str,"G\z"),! // returns 0
WRITE $LOCATE(str,"G"_$CHAR(10)_"\z"),! // returns 7
WRITE $LOCATE(str,$CHAR(10)_"\z"),! // returns 8
単語境界
一致が単語境界で発生するように制限できます。単語境界は、非単語構成文字の次の単語構成文字、または文字列の先頭の単語構成文字で特定されます。単語構成文字は、\w 文字タイプ (英字、数字、およびアンダースコア文字) に一致する文字です。一般的にこれは、string の先頭か空白文字や句読点文字に続く単語の最初の文字です。単語境界の正規表現構文は以下のとおりです。
-
\b は非単語構成文字と単語構成文字の境界の出現、または文字列先頭の単語構成文字と一致します。
-
\B (否定) は単語構成文字と単語構成文字との境界、または非単語構成文字と非単語構成文字との境界の出現と一致します。
以下の例では \b を使用して、部分文字列 in または un で始まる単語境界との一致を指定しています。
SET str(1)="unlucky" // match: "un" is at start of string
SET str(2)="highly unlikely" // match: "un" follows a space character
SET str(3)="fall in place" // match: "in" can be followed by a space
SET str(4)="the %integer" // match: % is a non-word character
SET str(5)="down-under" // match: - is a non-word character
SET str(6)="winning" // no match: "in" preceded by word character
SET str(7)="the 4instances" // no match: a number is a word character
SET str(8)="down_under" // no match: an underscore is a word character
FOR i=1:1:8 {
WRITE $MATCH(str(i),".*\b[iu]n.*")," string",i,!
}
以下の例では \B を使用して、単語境界にない場合の正規表現を検索しています。
SET str(1)="the thirteenth item"
WRITE $LOCATE(str(1),"\Bth") // returns 13 ("th" preceded by a word character)
SET str(2)="the^thirteenth^item"
以下の例では、単語構成文字を指定しない正規表現での \b および \B の使用方法を示しています。
SET str(1)="this##item"
WRITE $LOCATE(str(1),"\b#"),! // returns 5 (the first # at a word boundary)
WRITE $LOCATE(str(1),"\B#") // returns 6 (the first # not at a word boundary)
論理演算子
論理 AND (&&)、論理 OR (|)、および減算 (– –) の演算子で値を結合することで複合文字タイプを表現できます。複合文字タイプは角括弧で囲む必要があります。
暗黙的 OR : 角括弧を論理演算子なしで使用すると、一致文字のリストまたは範囲を指定できます。これらのいずれかが true である必要があります。[\p{LU}1234]、[[:upper:]1234]、[\p{LU}1-4]、[[:upper:]1-4] などは、すべての大文字と数字の 1234 に一致します。
AND (&&) : 論理 AND を使用すると、複数の文字タイプ・メタ文字を指定できます。どちらも true である必要があります。例えば、一致をギリシャ文字の大文字のみに制限するには、[\p{LU}&&\p{greek}] または [[:upper:]&&[:greek:]] を指定できます。
OR (|) : 論理 OR を使用すると、複数の文字タイプ・メタ文字を指定できます。いずれかが true である必要があります。例えば、一致を数字かギリシャ文字に制限するには、[\p{N}|\p{greek}] または [[:digit:]|[:greek:]] を指定できます。明示的 OR の使用はオプションです。論理演算子のない文字タイプのリストは、論理 OR と解釈されます。
SUBTRACT (– –) : 論理減算を使用すると、複数の文字タイプ・メタ文字を指定できます。最初は true で、2 番目は false になる必要があります。例えば、ギリシャ文字を除く大文字のすべてに一致を制限するには、[\p{LU}--\p{greek}] または [[:upper:]--[:greek:]] を指定できます。
文字表現メタ文字
以下に個々の文字のメタ文字表現を示します。各シーケンスは単一の文字に一致します。
いくつかの個別制御文字 ($CHAR(7)、$CHAR(9)、$CHAR(10)、$CHAR(12)、$CHAR(13)、および $CHAR(27)) は、単一文字タイプを使用しても表現できます。
16 進、8 進、および Unicode の表現
16 進表現。例えば、\x5A は英字 ‘Z’ です。16 進文字 (A ~ F) では、大文字と小文字が区別されないことに注意してください。先頭のゼロは含めることも、省略することもできます。
\xnn は、1 桁か 2 桁の 16 進数に使用できます。16 進数でそれよりも桁数が多い場合、\x{nnn} 中括弧構文を使用する必要があります。nnn は、1 ~ 7 桁の 16 進値で最大値は 010FFFF にできます。例えば、\x{005A} は英字 ‘Z’ です。\x{396} はギリシャ文字のゼータです。
8 進表現。nnn 値は、2 ~ 4 桁の 8 進値ですが、左端の桁はゼロにする必要があります。例えば、キャリッジ・リターン文字 $CHAR(13) は、\015 や \0015 で表現できます。最大値は \0377 で、$CHAR(255) を示します。
Unicode 表現。nnnn 値は、Unicode 文字に対応する 4 桁の16 進数です。例えば、\u005A は英字 ‘Z’ ($CHAR(90)) です。\u03BB はギリシャ語の子文字のラムダ ($CHAR(955)) です。
制御文字表現
制御文字は、出力不能 ASCII 文字 ($CHAR(0) ~ $CHAR(31)) です。以下の構文を使用して表現できます。
\cX
X は、ASCII 制御文字 (0 ~ 31 の文字) に対応する文字または記号です。文字は、$CHAR(1) ~ $CHAR(26) に対応します。例えば、\cH は $CHAR(8) で、バックスペース文字です。X 文字では、大文字と小文字は区別されません。出力不能制御文字は、同じ ASCII 文字セット・シーケンスに続きます ($CHAR(0) = \c@ または \c`、$CHAR(27) = \c{ または \c[、$CHAR(28) = \c| または \c\、$CHAR(29) = \c} または \c]、$CHAR(30) = \c^ または \c~、$CHAR(31) = \c_)。
記号名表現
この文字タイプは、単一の出力可能な句読点、空白、および記号文字の一致に使用できます。構文は、以下のとおりです。
\N{charname}
例えば、\N{comma} はコンマに一致します。メタ文字の \N は大文字である必要があります。
サポート対象文字名には、アクセント記号 (´)、アンド記号 (&)、アポストロフィ (')、アスタリスク(*)、短音記号 (˘)、セディラ (¸)、コロン (:)、コンマ (,)、短剣符 (†)、度数記号 (°)、除算記号 (÷)、ドル記号 ($)、二重短剣符 (‡)、全角ダッシュ (—)、二分ダッシュ (–)、感嘆符 (!)、等号 (=)、終止符 (.)、抑音アクセント (`)、無限大 (∞)、左中括弧 ({)、左括弧 (()、左角括弧 ([)、長音記号 (¯)、乗算記号 (×)、加算記号 (+)、シャープ記号 (#)、プライム符号 (′)、疑問符 (?)、右中括弧 (})、右括弧 ())、右角括弧 (])、セミコロン (;)、スペース( )、平方根 (√)、チルダ (~)、垂直線 (|) が含まれます。添え字 0 ~ 9 と上付き文字 0 ~ 9 もサポートされています。
モード
モードにより、これに続く文字一致の解釈が変更されます。mode は単一の小文字により指定されます。モードの使用には、2 つの方法があります。
-
正規表現シーケンスのモード。例えば、(?i) です。
-
正規表現内における指定リテラルのモード。のいずれかの型にできます。例えば、(?i:(fred|ginger)) です。
以下の mode 文字がサポートされます。
ケース・モード。アクティブな場合、大文字と小文字を正規表現にマッチングさせる際に、大文字と小文字の違いが無視されます。
複数行モード。複数行の文字列に適用される際に、^ (文字列の先頭) と $ (文字列の最後) のアンカーの動作に影響を与えます。既定では、これらのアンカーは、文字列全体に適用されます。複数行モードがアクティブな場合、これらのアンカーは、複数行内における各行の先頭と終端に適用されます。行の先頭は、改行文字の 10、11、12、13、および 133 (および Unicode の 8232 と 8233) のいずれかにできます。
単一行モード。オフの場合、ドット (.)ワイルドカードは、改行文字 10、11、12、13、および 133 (および Unicode の 8232 と 8233) に一致しません。オンの場合、ドット (.) ワイルドカードは、改行文字を含めて、すべての文字に一致します。キャリッジ・リターン ($CHAR(13)) と改行 ($CHAR(10)) のペアがこの順序で指定されていると、正規表現で単一文字としてカウントされます。
フリー・スペース・モード。空白と後続のコメントが正規表現で使用できます。
正規表現シーケンスのモード
regexp モードは、適用された時点から正規表現の最後まで、または明示的にオフになるまで、正規表現の解釈を制御します。構文は、以下のとおりです。
(?n) to turn mode on
(?-n) to turn mode off
n は、モード・タイプを指定する単一の小文字です。
以下の例は、ケース・モード (?i) を示します。
WRITE $MATCH("A","(?i)[abc]"),!
WRITE $MATCH("a","(?i)[abc]")
以下の例は、ケース・モード (?i) を示します。最初の正規表現では大文字と小文字が区別されます。2 番目の正規表現における先頭はケース・モード修飾子 (?i) であり、正規表現では大文字と小文字が区別されません。
SET name(1)="Smith,John"
SET name(2)="dePaul,Lucius"
SET name(3)="smith,john"
SET name(4)="John Smith"
SET name(5)="Smith,J"
SET name(6)="R2D2,CP30"
SET n=1
WHILE $DATA(name(n)) {
IF $MATCH(name(n),"\p{LU}\p{LL}+,\p{LU}\p{LL}+")
{ WRITE name(n)," : case match",! }
ELSEIF $MATCH(name(n),"(?i)\p{LU}\p{LL}+,\p{LU}\p{LL}+")
{ WRITE name(n)," : non-case match",! }
ELSE { WRITE name(n)," : not a valid name",! }
SET n=n+1 }
以下の例は、単一行モード (?s) を示します。このモードでは、".*" が改行文字のある文字列に一致します。
SET line(1)="This is a string without line breaks."
SET line(2)="This is a string with"_$CHAR(10)_"one line break."
SET line(3)="This is a string"_$CHAR(11)_"with"_$CHAR(12)_"two line breaks."
SET i=1
WHILE $DATA(line(i)) {
IF $MATCH(line(i),".*") {WRITE "line(",i,") is a single line string",! }
ELSEIF $MATCH(line(i),"(?s).*") {WRITE "line(",i,") is a multiline string",! }
ELSE {WRITE "string error",! }
SET i=i+1 }
以下の例は、単一行モード (?s) を示します。キャリッジ・リターンと改行のペアがその順序出現すると、正規表現で 1 文字としてカウントされます。
SET str(1)="one"_$CHAR(13)_$CHAR(10)_"two" // CR/LF
SET str(2)="one"_$CHAR(10)_$CHAR(13)_"two" // LF/CR
SET i=1
WHILE $DATA(str(i)) {
WRITE $LENGTH(str(i))," is the length of string ",i,!
IF $MATCH(str(i),"(?s).{7}") { WRITE "string ",i," matches 7 chars",! }
ELSEIF $MATCH(str(i),"(?s).{8}") { WRITE "string ",i," matches 8 chars",! }
ELSE { WRITE "string match error",! }
SET i=i+1
}
以下の例は、複数行モード (?m) を示します。終端アンカー ($) により識別される部分文字列を探します。単一行モードでは、この終端部分文字列は必ず break (文字列における最後の部分文字列) になります。複数行モードでは、終端部分文字列は、複数行文字列内で行が終了する任意の部分文字列にできます。
SET line(1)="String without line break"
SET line(2)="String with"_$CHAR(10)_" one line break"
SET line(3)="String"_$CHAR(11)_" with"_$CHAR(12)_" two line break"
SET i=1
WHILE $DATA(line(i)) {
WRITE $LOCATE(line(i),"(String|with|break)$")," line(",i,") in single-line mode",!
WRITE $LOCATE(line(i),"(?m)(String|with|break)$")," line(",i,") in multi-line mode",!!
SET i=i+1 }
リテラルのモード
また、以下の構文を使用して、モード修飾子をリテラル (またはリテラルのセット) に適用できます。
(?mode:literal)
このモード修飾子は、括弧内のリテラルにのみ適用されます。
以下のケース・モード (?i) 例では、この接頭語の大文字化処理に関係なく、先頭が de、del、dela、および della である名字 (lname) に一致します。残りの lname は大文字で始まり、小文字が 1 文字以上その後に続く必要があります。
SET lname(1)="deTour"
SET lname(2)="DeMarco"
SET lname(3)="DeLaRenta"
SET lname(4)="DelCarmine"
SET lname(5)="dellaRobbia"
SET i=1
WHILE $DATA(lname(i)) {
WRITE $MATCH(lname(i),"(?i:de|del|dela|della)\p{LU}\p{LL}+")," = ",lname(i),!
SET i=i+1 }
Comments
正規表現内で、2 種類のコメントを指定できます。
-
埋め込みコメント
-
行末コメント ((?x) モード内のみ)
埋め込みコメント
以下の構文を使用することで、埋め込みコメントを正規表現内で指定できます。
(?# comment)
以下の例は、正規表現内におけるコメントの使用法を示しています。このコメントでは、この書式一致はアメリカ式日付 (MM/DD/YYYY) 用であり、ヨーロッパ式日付 (DD/MM/YYYY) 用ではないことを記載しています。
WRITE $MATCH("04/28/2012","^[01]\d(?# months)/[0123]\d(?# days)/\d\d\d\d$")
行末コメント
フリー・スペース・モード (?x) が有効な場合、以下の構文を使用して、コメントを正規表現の最後に指定できます。
# comment
以下の例は、フリー・スペース・モードでの最後のコメントを示しています。
WRITE $MATCH("04/28/2012","^[01]\d/[0123]\d/\d\d\d\d$")," no comment",!
WRITE $MATCH("04/28/2012","^[01]\d/[0123]\d/\d\d\d\d$# date test")," comment no (?x) mode",!
WRITE $MATCH("04/28/2012","(?x)^[01]\d/[0123]\d/\d\d\d\d$# date test")," comment in (?x) mode",!
フリー・スペース・モードでは、空白を正規表現内に含めることができます。
エラー・メッセージ
適切に regexp を指定しないと、<REGULAR EXPRESSION> エラーが発生します。エラーのタイプを判別するには、LastStatus()Opens in a new tab メソッドを以下の例のように呼び出すことができます。
TRY {
WRITE "TRY block:",!
WRITE $MATCH("A","\p{LU}"),! // good regexp
WRITE $MATCH("A","\p{}"),! // bad regexp
}
CATCH exp {
WRITE !,"CATCH block exception handler:",!
IF 1=exp.%IsA("%Exception.SystemException") {
WRITE "System exception",!
WRITE "Name: ",$ZCVT(exp.Name,"O","HTML"),!
WRITE "Location: ",exp.Location,!
WRITE "Code: ",exp.Code,!! }
ELSE {WRITE "Unexpected exception type",! RETURN }
WRITE "%Regex.Matcher status:"
DO $SYSTEM.Status.DisplayError(##class(%Regex.Matcher).LastStatus())
RETURN
}
これらのエラーのリストは、"一般的なエラー・メッセージ" を参照してください。
関連項目
-
$LOCATE 関数
-
$MATCH 関数
-
パターン・マッチング (?) 演算子 (正規表現を使用しません)