正規表現 (regex) とは、特定の構文ルールに基づいて文字列のコレクションを説明する、またはマッチさせる文字列です。正規表現の使用による文字列の検索および操作は、テキストエディター、ユーティリティ、およびプログラミング言語において一般的になってきています。正規表現は宣言型であるため、GeneXus で完全に対応しています。
Java、.NET、および Ruby のジェネレーターは、サーバー側だけではなく、クライアント側 (生成された JSscript) でも正規表現を使用できます。
GeneXus では、POSIX および POSIX ERE (Extended) の正規表現の構文を使用します。 これらの仕様については、こちらを参照してください。
RegExMatch データタイプについては、こちらを参照してください。
適用範囲: Character、LongVarChar、および VarChar データタイプ
目的: 文字列がパターンに一致しているかどうかを確認します。
構文:
B.IsMatch(C)
戻されるタイプは Boolean です。B および C は、文字列の項目属性または変数です。B はパターンと照合する文字列、C はパターン (正規表現) の文字列です。
説明: このメソッドは、C の正規表現と B の文字列を照合し、一致した場合は true を返します。一致しなかった場合は false を返します。正規表現の構文については、下の「正規表現の構文」を参照してください。
例:
&pattern = "\w+( [ -+.' ] \w+)*@\w+( [ -. ] \w+)*\.\w+( [ -. ] \w+)*" // 電子メールアドレスの有効なパターン
if(&str.IsMatch(&pattern))
&result="MATCH"
else
&result="DOESN'T MATCH"
endif
// &str が次のような値の場合に、上のコードを実行したときの &result の値を示します。
// &str &result
// "john.doe12@mail.com.uk" "MATCH"
// "john.doe@mail." "DOESN'T MATCH"
注: 項目属性またはドメインの Regular Expression プロパティの値として正規表現を使用する場合は、その先頭と末尾に二重引用符を付けません。例: "\w+( [ -+.' ] \w+)*@\w+( [ -. ] \w+)*\.\w+( [ -. ] \w+)*" ではなく、\w+( [ -+.' ] \w+)*@\w+( [ -. ] \w+)*\.\w+( [ -. ] \w+)* を使用します。
適用範囲: Character、LongVarChar、および VarChar データタイプ
目的: 指定したパターンと一致するすべての箇所を指定した文字列に置き換えます。
構文:
B.ReplaceRegEx(C,D)
戻されるタイプは文字列です。B、C、および D は、文字列の項目属性または変数です。B は、パターン (正規表現) と一致した箇所が置き換えられる文字列、C は正規表現の文字列、D は正規表現と一致した箇所を置き換える文字列です。
説明: このメソッドは、B の中でパターン C に一致したすべての箇所を D に置き換えます。このパターンで使用する構文については、下の「正規表現の構文」を参照してください。置き換える文字列は、別の文字列にすることも、置き換えられる文字列の一部にする ($X を使用) こともできます。$X は、パターンで定義しているグループの番号を指します。グループは、() を使って定義し、番号はそのグループが現れる順番を指します。詳しくは、下の「正規表現の構文」を参照してください。
例:
&pattern = "\b(\d{1,2})/(\d{1,2})/(\d{2,4})\b" // dd/mm/yyyy 形式の日付
&str = "11/12/2003 extra 8/12/2003"
&rslt = &str.ReplaceRegEx(&pattern,&replacement)
// &str が次のような値の場合に、上のコードを実行したときの &rslt の値を示します。
// &replacement &rslt
// "$2-$1-$3" "12-11-2003 extra 12-8-2003" //mm-dd-yyyy に変換。
// "<<DATE>>" "<<DATE>> extra <<DATE>>" // 日付の入れ替え
適用範囲: Character、LongVarChar、および VarChar データタイプ
目的: パターンと一致する文字列の集まりを返します。
構文:
B.Matches(C)
戻されるタイプは、RegExMatch タイプの集まりです。B と C は、文字列の項目属性または変数です。B はパターンと照合する文字列、C はパターン (正規表現) の文字列です。
Description: このメソッドは、入力文字列のうち、パターン (C) に一致する部分文字列の集まりを返します。結果は、RegExMatch タイプの集まりです。このデータタイプについて詳しくは、下の「RegExMatch データタイプ」を参照してください。
例:
&pattern = "\b(\d{1,2})/(\d{1,2})/(\d{2,4})\b" // dd/mm/yyyy 形式の日付
&str = "11/12/2003 extra 8/12/2003 extra 2/5 other text"
&rslt = &str.Matches(&pattern)
// 上のコードを実行すると、&rslt には RegExMatch タイプの"11/12/2003" と "8/12/2003" が含まれます。
適用範囲: Character、LongVarChar、および VarChar データタイプ
目的: パターンを使用して文字列を分割します。
構文:
B.SplitRegEx(C)
戻されるタイプは、文字列タイプの集まりです。B と C は、文字列の項目属性または変数です。B は分割される文字列、C はパターン (正規表現) の文字列です。
説明: このメソッドは、入力文字列のうち、パターン (C) に一致しない部分文字列の集まりを返します。結果は、文字列の集まりになります。
例:
&pattern = "\b(\d{1,2})/(\d{1,2})/(\d{2,4})\b" // dd/mm/yyyy 形式の日付
&str = "11/12/2003 extra 8/12/2003 extra 2/5 other text"
&rslt = &str.SplitRegEx(&pattern)
// 上のコードを実行すると、&rslt にはストリングの""、" extra " および " extra 2/5 other text" が含まれます。
|
説明 |
例 |
|
|
一致するもの |
一致しないもの |
|
任意の文字 |
X |
[ すべて一致 ] |
[ abcde ] |
{abcde} セットの文字* |
a |
A、f、または # |
[ ^abcde ] |
{abcde} セットに含まれない文字* |
A または g |
c |
[ a-z0-9 ] |
{a,b,c...z} セットと {0,1,2...9} のセットに含まれる文字* |
b |
B または # |
\w |
[ a-zA-Z0-9_ ] (リテラル、数字、またはアンダースコア) |
B、9、または _ |
# または " " (空白) |
\W |
[ ^a-zA-Z0-9_ ] (リテラル、数字、またはアンダースコア以外) |
# または " " (空白) |
B、9、または _ |
\d |
[ 0-9 ] (数字) |
8 |
A または # |
\D |
[ ^0-9 ] (数字以外) |
A または # |
8 |
\s |
空白 |
" " |
A、8、または # |
\S |
空白以外 |
A、8、または # |
" " |
\xdd |
dd は 16 進法の数値です。ascii コードが dd の文字を見つけます。 |
\x41 は A、\x40 は @ です。
|
|
\udddd |
dd は 16 進法の文字です。Unicode が dddd の文字を見つけます。 |
\u0013 は #、\u0030 は @ です。 |
|
* 文字クラス内のメタ文字:
文字クラス内で特殊な意味を持つ文字 (メタ文字) は、閉じかっこ ( ] )、バックスラッシュ (\)、脱字記号 (^)、およびハイフン (-) のみです。ほかの特殊文字は、文字クラス内で通常の文字と見なされるので、バックスラッシュでエスケープする必要はありません。アスタリスクやプラス記号を見つけるには [ +* ] を使用します。文字クラス内のメタ文字をエスケープすれば、正規表現が正しく動作しますが、かなり読みにくくなります。
バックスラッシュを文字クラス内で特別な意味のない文字として使用するには、もう 1 つバックスラッシュを追加してエスケープする必要があります。 [ \\x ] はバックスラッシュまたは x と一致します。閉じかっこ ( ] )、脱字記号 (^)、ハイフン (-)を使用する場合は、バックスラッシュでエスケープするか、特別な意味を持たない場所に配置します。読みにくくなるのを防ぐため、後者の方法をお勧めします。脱字記号を使用する場合は、開きかっこ直後以外の位置に配置します。 [ x^ ] は、x または脱字記号と一致します。ハイフンは、開きかっこの直後、閉じかっこの直前、または脱字記号の直後に配置できます。 [ -x ] と [ x- ] は、どちらも x またはハイフンに一致します。
閉じかっこは、開きかっこまたは脱字記号の直後に配置できます。 [ ] x ] は、閉じかっこ、または x と一致します。 [ ^ ] x ] は、閉じかっこと x を除く任意の文字と一致します。ただし、この方法は、判読しにくい上、Ruby ジェネレーターではエラーの標準出力に警告が示されるので、なるべく使用しないでください。
|
説明 |
^ |
行の先頭: たとえば ^ab というパターンで、ab は見つかりますが、aab は見つかりません。 |
$ |
行の末尾: たとえば ab$ というパターンで、=ab<<改行>> は見つかりますが、abc は見つかりません。 |
\b |
単語と単語の間のみに制限: たとえば ab.\bcde というパターンで、ab cde は見つかりますが、abocde は見つかりません。 |
\B |
単語間の制限なし |
\A |
入力文字列の先頭 |
\G |
前の一致箇所の末尾 |
\Z |
文字列の末尾または文字列の末尾の \n の前 |
\z |
文字列の末尾 |
|
説明 |
例 |
|
|
RE |
一致するもの |
一致しないもの |
* |
0 以上 |
a* |
aaaaa または "" |
b |
? |
0 または 1 |
a? |
a または "" |
b |
+ |
1 以上 |
a+ |
aaaa または a |
a または b |
{n} |
正確に n 回 |
a{3} |
aaa |
aa または aaaa |
{n, } |
少なくとも n 回 |
a{2, } |
aa または aaaaa |
a または bb |
{n,m} |
n 以上かつ m 以下 |
a{2,4} |
aa、aaa、または aaaa |
a または aaaaa |
*? |
ゼロまたは最低限の繰り返し (あいまい) |
a*? |
aaaa または "" |
b |
?? |
ゼロまたは 1 回。ゼロが望ましい (あいまい) |
a?? |
a または "" |
b または aa |
+? |
1 回または最低限の繰り返し (あいまい) |
a+? |
aaa または a |
"" b |
{n,}? |
少なくとも n 回以上、最低限の繰り返し (あいまい) |
a{2,}? |
aa または aaaa |
a |
{n,m}? |
n 回以上 m 回以下、最低限の繰り返し (あいまい) |
a{2.3,}? |
aa または aaa |
a または aaaa |
() |
グループを取得。(と) の間で定義した正規表現に一致するものをすべて置き換えるには、置き換える文字列で $n を使用します。詳しくは、上の「ReplaceRegEx」を参照してください。
たとえば、パターンが a(b*)c、置き換えられる文字列が abbbc、置き換える文字列が $1 の場合の結果は bbb になります。
|
(?:X) |
X を取得しない。$n 表現でアクセスできないグループを定義します。 |
(?flgs) |
グループのフラグを有効にします。たとえば、パターンが (?i)ac の場合は、ac と AC が見つかります。i は、大文字と小文字を区別しないというフラグです。 |
(?flgs:X) |
X のフラグを有効または無効にします。たとえば、パターンが (?i: ac) の場合は、ac と AC が見つかります。i は、大文字と小文字を区別しないというフラグです。 |
(?=X) |
X が右側と一致する場合のみ、照合を続けます。右側は制限しません。つまり、(?=X) が一致する場合は (?=X)X も一致します。
たとえば、パターンが aaa(?=bbb) の場合は、文字列 aaabbb が見つかります。パターンが (aaa(?=bbb)) で、置き換えられる文字列が aaabbb 、置き換える文字列が $1 の場合の結果は aaa になります。
|
(?!X) |
X が右側と一致しない場合のみ、照合を続けます。 |
$n |
n 番目のグループと置き換えます。 |
X|Y |
X または Y |
s |
ドット (.) は任意の文字を表します (改行を含む)。 |
m |
複数行 |
i |
大文字と小文字を区別しない |
タイプ: 文字列を見つける正規表現を指定するときに使用するデータタイプ。
プロパティ:
Value: パターンのグループを使用して見つかった文字列。パターンで定義した各グループに一致する文字列の集まり。
例:
&Input ="11/12/2003 extra 8/12/2003 extra 2/5 other text"
&RegularExpression ="\b(\d{1,2})/(\d{1,2})/(\d{2,4})\b" // xx/xx/xxxx 形式の日付の正規表現
&matchCollection = &Input.Matches(&RegularExpression) //&matchCollection は RegExpMatch コレクション
&rslt =""
for &match in &matchCollection
&rslt += " [ " + &match.Value + " "
for &item in &match.Groups
&rslt += "(" + &item + ")"
endFor
&rslt += t + " ] "
endfor
// &rslt は " [ 11/12/2003 (11)(12)(2003) ] [ 8/12/2003 (8)(12)(2003) ] "
上の例の説明
&rslt の値は、" [ 11/12/2003 (11)(12)(2003) ] [ 8/12/2003 (8)(12)(2003) ] " になります。11/12/2003 と 8/12/2003 は、パターンを使用して見つかった文字列です。「(」と「)」の間の値は、見つかった各文字列の中にある、パターンのグループの定義に一致する値です。
正規表現を使用したときに発生したエラーは、次の静的メソッドでチェックすることができます:
適用範囲: RegEx
目的: 正規表現を呼び出した後で、コードにエラーがあるかどうかをチェックします。
構文:
RegEx.GetLastErrCode()
説明: このメソッドは数値を返します。0 はエラーがないことを示し、1 はエラーが 1 件発生したことを示します。
適用範囲: RegEx
目的: 正規表現を呼び出した後で発生したエラーの説明を取得します。
構文:
RegEx.GetLastErrDescription()
説明: このメソッドは、最後のエラーの説明を示す文字列を返します。この説明は、使用しているジェネレーターによって異なります。
&pattern = " [ z-a ] " //この正規表現は無効です。
&str = "abc"
&rslt = &str.Matches(&pattern)
&errCode = RegEx.GetLastErrCode()
&errDsc = RegEx.GetLastErrDescription()
// この場合、&errCode は 1 に、&errDsc は、次のようになります:
// .NET の場合:
// " [ z-a ] " - [ x-y ] の範囲内で逆順にパースします。
//
//Java の場合:
// 不正文字列の範囲はインデックス 3 付近です。
// [ z-a ]
// ^
&string = "alaalaalaala"
&replaceSentence = "($1) "
&rslt = &string.ReplaceRegEx(&RegularExpression,&replaceSentence)
この例では、&RegularExpression = "((ala)+?)" の場合は &rslt= "(ala) (ala) (ala) (ala) " になりますが、&RegularExpression = "((ala)+)" の場合は &rslt= "(alaalaalaala) " になります。
これはなぜでしょうか。あいまい表現とともに量指定子を使用 (+?) すると、正規表現に一致するパターンのうち、最も短いものが返されるからです。一方、? とともに量指定子を使用しないと、正規表現に一致するパターンのうち、最も長いものが返されます。
したがって、1 番目の正規表現では、最も短い "ala" が 4 つ、2 つ目の正規表現では入力文字列 "alaalaalaala" 全体が結果として返されます。
有効な電子メールアドレス:
\w+( [ -+.' ] \w+)*@\w+( [ -. ] \w+)*\.\w+( [ -. ] \w+)*
有効な電子メールアドレス (空のメールを許可):
^(\w+( [ -+.' ] \w+)*@\w+( [ -. ] \w+)*\.\w+( [ -. ] \w+)*)??\s*$
URL (プロトコル、ドメイン、ポート、ファイル、パラメーター):
\b(?i:https?|ftp)(://( [ \w. ] +(:\d{1,4})?)(/ [ \w+&@#/%=_!:,.; ] *))?(\? [ \w+&@#/%=_|!:,.; ] *)?
有効な IP: 0.0.0.0 から 255.255.255.255 (キャプチャ-なし)
\b(?:(?:25 [ 0-5 ] |2 [ 0-4 ] \d| [ 01 ] ?\d{1,2})\.){3}(?:25 [ 0-5 ] |2 [ 0-4 ] \d| [ 01 ] ?\d{1,2})\b
パス (ドライブ、フォルダ、ファイル名):
\b(?i: [ a-z ] ):\\( [ ^/:*?"<> ] *\\)?( [ ^\\/:*?"<> ] *)
数値、文字、アンダースコアが有効な文字:
^ [ \w ] *$
正規表現のテスト用オンラインツール:
Regexpal。強力で使いやすい、JS の正規表現テスト用ツール。
HiFi Regex ツール。正規表現を分かりやすく視覚化してくれる、JS の正規表現テスト用ツール。ReplaceRegEx メソッドや Matches メソッドのテストに最適です。
http://www.fileformat.info/tool/regex.htm
http://www.radsoftware.com.au/regexdesigner/: 正規表現、ReplaceRegEx、Matches メソッドをテストするのに便利なツール。
詳細情報:
正規表現のチュートリアル
Java 正規表現の実装: GeneXus で生成するアプリケーションで使用します。
C# 正規表現の実装: GeneXus で生成するアプリケーションで使用します。
|