正規表現のシンタックスにはいくつかの基本ルールと方式があります。

文字セットの使用

正規表現の角括弧の中では、1 文字のマッチングに使用する一連の文字(文字セット)を定義します。例えば、正規表現 "[A-Za-z]" は、1 文字の大文字または小文字に一致します。

文字セット内のハイフンは、文字の範囲を示します。例えば、[A-Z] は任意の大文字 1 文字に一致します。

文字セット内の ^ 文字は、後続の文字を否定します。例えば、[^A-Z] は、大文字でない任意の 1 文字に一致します。

正規表現 "B[IAU]G" は、文字列 "BIG"、"BAG"、"BUG" には一致しますが、文字列 "BOG" には一致しません。

"B[IA][GN]" のように文字セットを連結すると、対応する各文字を連結したものに一致します。この正規表現は、"B" の後に "I" または "A" が続き、その後に "G" または "N" が続く文字列に一致します。つまり、"BIG"、"BAG"、"BIN" および "BAN" に一致します。

正規表現 [A-Z][a-z]* は、1 文字の大文字で始まり、その後に 0 文字以上の小文字が続く任意の文字列に一致します。右角括弧の後の * は、その文字セットの 0 回以上の繰り返しに一致するように指定する特殊文字です。

注意:

* が適用されるのはその直前の文字セットだけで、正規表現全体ではありません。

右角括弧の後の + は、その文字セットの 1 回以上の繰り返しを検索するように指定します。正規表現 " [A-Z]+ " は、前後にスペースがある 1 文字以上の大文字に一致します。したがって、この正規表現は、" BIG " だけでなく、" LARGE "、" HUGE "、" ENORMOUS " など、前後にスペースがある任意の大文字の文字列に一致します。

ColdFusion(2018 リリース)アップデート 5 の変更点

ColdFusion(2018 リリース)アップデート 5 では、アプリケーションフラグ useJavaAsRegex が導入されました。このフラグをアプリケーションレベルで有効にした場合は、デフォルトの Regex エンジンをオーバーライドして、Java Regex エンジンを使用することができます。

このオプションはサーバーレベルで有効にすることもできます。ColdFusion Administrator のサーバーの設定/設定にある「Java を Regex エンジンとして使用」オプションを有効にします。

例えば、デフォルトの Perl Regex エンジンを使用すると、次のようなコードを記述できます。

<cfscript>
     writeOutput(refind("[[:digit:]]","abc 456 ABC 789? Paraguay for $99 airfare!")) // Returns 5
</cfscript>

useJavaAsRegex フラグを有効にすると、上記のコードを次のように書き換えることができます。

<cfscript>
     writeOutput(refind("\p{Digit}","abc 456 ABC 789? Paraguay for $99 airfare!")) // Returns 5
</cfscript>

Perl および Java Regex エンジンの機能比較

機能 Java Perl
円記号:1 つのメタ文字をエスケープ
\Q...\E:メタ文字列をエスケープ Java 6
\x00~\xFF(ASCII 文字)
\n(LF)
\f(フォームフィード)および \v(垂直タブ)
\a(ベル)
\e(エスケープ)
\b(バックスペース)および \B(円記号) × ×
\cA~\cZ(制御文字)
\ca~\cz(制御文字) ×
[abc]:文字クラス
[^abc]:文字クラスの否定
[a-z]:文字クラスの範囲
[\d-z] のハイフンはリテラル
[a-\d] のハイフンはリテラル × ×
円記号:1 つの文字クラスメタ文字をエスケープ
\Q...\E:文字クラスメタ文字列をエスケープ Java 6
\d:数字の簡易表記 ascii
\w:単語文字の簡易表記 ascii
\s:空白文字の簡易表記 ascii
¥D
[\b]:バックスペース
.(ドット:改行以外の任意の文字)
^(文字列/行の先頭)
$(文字列/行の末尾)
\A(文字列の先頭)
\Z(文字列の末尾)
\z(文字列の末尾)
\`(文字列の先頭) × ×
\'(文字列の末尾) × ×
\b(単語の先頭または末尾)
\B(単語の先頭または末尾以外)
\y(単語の先頭または末尾) × ×
\Y(単語の先頭または末尾以外) × ×
\m(単語の先頭) × ×
\M(単語の末尾) × ×
\<(単語の先頭) × ×
\>(単語の末尾) × ×
|(選択肢)
機能 Java Perl
? (0 回または 1 回の出現)
*(0 回以上の繰り返し)
+(1 回以上の繰り返し)
{n}(正確に n 回の繰り返し)
{n
{n
? :上記量指定子のいずれかの後に付けて「最短一致」を指定
(regex)(番号付きキャプチャグループ)
(?:regex)(非キャプチャグループ)
\1~\9(後方参照)
\10~\99(後方参照)
\1~\9 の前方参照
\1~\9 のネストされた参照
存在しないグループの後方参照はエラー
失敗したグループへの後方参照も失敗
(?i)(大文字と小文字を区別しない)
(?s)(ドットが改行文字にも一致)
(?m)(^ と $ が改行にも一致)
(?x)(フリースペースモード)
(?n)(明示的キャプチャ) × ×
(?-ismxn)(モード修飾子をオフにする)
(?ismxn:group)(モード修飾子はグループに対してローカル)
機能 Java Perl
(?>regex)(アトミックグループ)
?+ n}+(所有量指定子)
(?=regex)(肯定先読み)
(?!regex)(否定先読み)
(?<=text)(肯定後読み) 有限長 固定長
(?<!text)(否定後読み) 有限長 固定長
\G(一致の開始)
(?(?=regex)then|else)(任意の先読み/後読みを使用) ×
(?(regex)then|else) × ×
(?(1)then|else) ×
(?(group)then|else) × ×
(?#comment) ×
フリースペース構文をサポート
文字クラスは単一トークン ×
#:コメントを開始
\X(Unicode 書記素) ×
\u0000~\uFFFF(Unicode 文字) ×
\x{0}~\x{FFFF}(Unicode 文字) ×
\pL~\pC(Unicode プロパティ)
\p{L}~\p{C}(Unicode プロパティ)
\p{Lu}~\p{Cn}(Unicode プロパティ)
\p{L&} および \p{Letter&}([\p{Lu}\p{Ll}\p{Lt}] Unicode プロパティと同等) ×
\p{IsL}~\p{IsC}(Unicode プロパティ)
\p{IsLu}~\p{IsCn}(Unicode プロパティ)
\p{Letter}~\p{Other}(Unicode プロパティ) ×
\p{Lowercase_Letter}~\p{Not_Assigned}(Unicode プロパティ) ×
\p{IsLetter}~\p{IsOther}(Unicode プロパティ) ×
\p{IsLowercase_Letter}~\p{IsNot_Assigned}(Unicode プロパティ) ×
\p{Arabic}~\p{Yi}(Unicode スクリプト) ×
\p{IsArabic}~\p{IsYi}(Unicode スクリプト) ×
\p{BasicLatin}~\p{Specials}(Unicode ブロック) ×
\p{InBasicLatin}~\p{InSpecials}(Unicode ブロック)
\p{IsBasicLatin}~\p{IsSpecials}(Unicode ブロック) ×
上記のすべてで {} 内の部分は大文字と小文字が区別されない ×
\P(上記に示したすべての \p の否定形)
\p{^...}(上記に示したすべての \p{...} の否定形) ×
(?<name>regex)(.NET 形式の名前付きキャプチャグループ) × ×
(?'name'regex)(.NET 形式の名前付きキャプチャグループ) × ×
\k<name>(.NET 形式の名前付き後方参照) × ×
\k'name'(.NET 形式の名前付き後方参照) × ×
(?P<name>regex)(Python 形式の名前付きキャプチャグループ) × ×
(?P=name)(Python 形式の名前付き後方参照) × ×
複数のキャプチャグループに同じ名前を付けることが可能 該当なし 該当なし
\i × ×
[abc-[abc]]:文字クラス減算 × ×
[:alpha:]:POSIX 文字クラス ×
\p{Alpha}:POSIX 文字クラス ascii ×
\p{IsAlpha}:POSIX 文字クラス ×
[.span-ll.]:POSIX 照合順 × ×
[=x=]:POSIX 同等文字 × ×

Java における正規表現パターンについて詳しくは、正規表現に関する Oracle 公式ドキュメントを参照してください。

特殊文字を使用する場合の注意事項

後ろに * が付いている正規表現は、その 0 回の繰り返しにも一致します。つまり、空の文字列にも一致します。次に例を示します。

REReplace("Hello","[T]*","7","ALL") - #REReplace("Hello","[T]*","7","ALL")#<BR>
</cfoutput>

これは、次のような結果になります。

REReplace("Hello","[T]*","7","ALL") - 7H7e7l7l7o7

正規表現 [T]* は、空の文字列にも一致します。この場合は、まず "Hello" の "H" の前にある空の文字列に一致します。"ALL" 引数が指定されているので、REReplace は正規表現のすべてのインスタンスを置き換えます。したがって、"e" の前にある空の文字列から "o" の前にある空の文字列まで同様に置換されます。

これは、おそらく意図した結果ではないと思われます。問題を回避する方法は、場合によって異なります。例えば、[T]* の代わりに、少なくとも 1 つの "T" がなければ一致しない [T]+ を使用することで解決できる場合があります。または、[T]* の後ろにパターンを追加することで解決できる場合もあります。 
次の例では、正規表現の末尾に "W" を追加しています。

REReplace("Hello World","[T]*W","7","ALL")
#REReplace("Hello World","[T]*W","7","ALL")#<BR>
</cfoutput>

この式では、より予測しやすい次のような結果が返されます。

REReplace("Hello World","[T]*W","7","ALL") - Hello 7orld

文字の繰り返しの検索

場合によっては、文字の繰り返しを検索文字列の中から検索することができます。
例えば、
正規表現 "a{2,4}" は、"a" が 2~4 回繰り返されている部分に一致します。
つまり、"aa"、"aaa"、"aaaa" には一致しますが、"a" や "aaaaa" には一致しません。
次の例では、REFind 関数はインデックス 6 を返します。

<!--- The value of IndexOfOccurrence is 6--->

正規表現 "[0-9]{3,}" は、3 桁以上の任意の整数に一致します。

"123" や "45678" などには一致しますが、
1 桁や 2 桁の整数には一致しません。

文字の繰り返しを検索するには、次のシンタックスを使用します。

  1. m,n
    m は 0 以上、nm 以上です。mn 回の繰り返しに一致します。式 {0,1} は、特殊文字 ? と同等です。

  2. m
    m は 0 以上です。m 回以上の繰り返しに一致します。{,n} というシンタックスは使用できません。式 {1,} は特殊文字 + と同等です。{0,} は * と同等です。

  3. }mm は 0 以上です。m 回の繰り返しにのみ一致します。

正規表現における大文字と小文字の区別

ColdFusion の正規表現関数には、大文字と小文字を区別するものと、区別しないものがあります。 REFindREReplace は大文字と小文字を区別して検索しますが、REFindNoCaseREReplaceNoCase は区別しません。 
大文字と小文字を区別する関数でも、区別しないで検索するように正規表現を記述することができます。大文字と小文字を区別しないようにするには、個々の文字を文字セットに置き換えます。例えば、大文字と小文字を区別する REFind または REReplace 関数で正規表現 [Jj][Aa][Vv][Aa] を使用すれば、次のどの文字列パターンも検索できます。

  • JAVA
  • java
  • Java
  • jAva
  • その他のすべての大文字と小文字の組み合わせ

サブ式の使用

小括弧を使用して、正規表現の一部をサブ式としてグループ化すれば、1 つのユニットとして処理できます。たとえば、正規表現 "ha" は、この文字列の 1 回の繰り返しに一致しますが、正規表現 "(ha)+" は、"ha" の 1 回以上の繰り返しに一致します。 
次の例では、正規表現 "B(ha)+" を使用して、文字 "B" の後に文字列 "ha" が 1 回以上繰り返されている文字列を検索します。

<!--- The value of IndexOfOccurrence is 5 --->

サブ式では、特殊文字 | を使用して "OR" 論理演算を行えます。次の正規表現を使用すると、"jelly" または "jellies" という単語を検索できます。

<!--- The value of IndexOfOccurrence is 26--->

特殊文字の使用

正規表現では、次の特殊文字が定義されています。

+ * ? . [ ^ $ ( ) { | \

特殊文字をリテラル文字として使用できる場合もあります。例えば、文字列内のプラス符号(+)を検索する場合は、次のように、プラス符号の前に円記号(¥)を付けてエスケープする必要があります。

"\+"

次の表で、正規表現で使用する特殊文字について説明します。

特殊文字 説明
  特殊文字の前に円記号(¥)を付けると、その特殊文字のリテラル文字に一致します。つまり、円記号は特殊文字をエスケープします。例えば、"¥+" はプラス符号に、"¥¥" は円記号に一致します。
\. ピリオド(.)は、改行文字を含む、すべての文字に一致します。改行文字以外の文字に一致させるには、[^#chr(13)##chr(10)#] を使用します。この正規表現は、ASCII のキャリッジリターンおよびラインフィードコードを除外しています。対応するエスケープコードは、¥r および ¥n です。
[ ] 指定された文字セット内の任意の 1 文字に一致します。例えば、"[akm]" は、"a"、"k"、"m" のいずれかの文字に一致します。文字セット内のハイフンは、文字の範囲を表します。例えば、[a-z] は任意の小文字 1 文字に一致します。文字セットの最初の文字がキャレット(^)である場合は、文字セット内の文字以外の任意の文字に一致します。空の文字列には一致しません。例えば、"[^akm]" は、 "a"、"k"、"m" のいずれでもない任意の文字に一致します。このキャレット(^)は、文字セットの最初の文字として使用した場合にのみ、この特殊な意味を持ちます。
^

正規表現の先頭でキャレット(^)を指定すると、一致する文字列は検索文字列の先頭にある文字列に限定されます。例えば、"^ColdFusion" という正規表現は、文字列 "ColdFusion lets you use regular expressions" には一致しますが、文字列 "In ColdFusion, you can use regular expressions" には一致しません。

文字セット内(角括弧内)のキャレット文字は、後続の文字を否定します。[^A] は、大文字の A 以外任意の文字に 一致します。

$ 正規表現の末尾でドル記号($)を指定すると、一致する文字列は検索文字列の末尾にある文字列に限定されます。例えば、"ColdFusion$" という正規表現は、文字列 "I like ColdFusion" には一致しますが、文字列 "ColdFusion is fun" には一致しません。
? 後ろに疑問符(?)が付いている文字セットまたはサブ式は、その文字セットまたはサブ式の 0 回または 1 回の繰り返しに一致します。例えば、"xy?z" は "xyz" または "xz" に一致します。
| OR 文字(|)を使用すると、2 つの正規表現から選択できます。例えば、jell(y|ies) は "jelly" または "jellies" に一致します。
+ 後ろにプラス符号(+)が付いている文字セットまたはサブ式は、その文字セットまたはサブ式の 1 回以上の繰り返しに一致します。たとえば、[a-z]+ は、1 文字以上の小文字に一致します。
* 後ろにアスタリスク(*)が付いている文字セットまたはサブ式は、その文字セットまたはサブ式の 0 回以上の繰り返しに一致します。たとえば、[a-z]* は 0 文字以上の小文字に一致します。
() 小括弧を使用して、正規表現の一部をサブ式としてグループ化すれば、1 つのユニットとして処理できます。例えば、(ha)+ は、"ha" の 1 回以上の繰り返しに一致します。
(?x) 正規表現の先頭でこれを指定すると、正規表現内の空白が無視されます。また、## を使用して行の最後にコメントを付けることもできます。一致させたいスペースは円記号(¥)でエスケープします。例えば、次の正規表現には ## で始まるコメントが含まれていますが、このコメントは検索時には無視されます。reFind("(?x) one ##first option {{two ##second option}} {{three\ point\ five ## note escaped spaces}} ", "three point five")
(?m) 正規表現の先頭でこれを指定すると、複数行モードで特殊文字 ^ および $ が一致するようになります。^ と共に使用すると、検索文字列全体の先頭だけでなく、ラインフィード文字またはchr(10) によって表される改行の先頭にも一致するようになります。$ と共に使用した場合は、検索文字列全体の末尾だけでなく、改行の末尾にも一致するようになります。 複数行 モードでは、キャリッジリターンまたはchr(13) は改行文字として認識されません。次の例では、複数行モードで文字列 "two" を検索します。{{#reFind("(?m)^two", "one#chr(10)#two")#}} この例では 4 が返されますが、これは、chr(10) ラインフィードの後の "two" に一致したことを示します。(?m) を指定しなかった場合、^ は文字列の先頭にのみ一致するので、この文字列では一致するものがありません。(?m) を使用しても、¥A または ¥Z の動作は変わりません。これらはそれぞれ、常に文字列の先頭または末尾に一致します。¥A および ¥Z の詳細については、「エスケープシーケンスの使用」を参照してください。
(?i) REFind() の正規表現の先頭でこれを指定すると、大文字と小文字を区別せずに比較が行われます。例えば、次のコードはインデックス 1 を返します。{{#reFind("(?i)hi", "HI")#}} (? i) ここで、(?i) を省略した場合は、正規表現に一致するものがないので、インデックス 0 が返されます。
(?=...) 正規表現の先頭でこれを指定すると、正規表現の検索時に肯定先読みが行われます。サブ式の前にこれを付けると、ColdFusion はそのサブ式に肯定先読みを使用します。肯定先読みでは、通常の小括弧と同様に、囲まれたサブ式が存在するかどうかがテストされますが、一致結果にはその内容が含まれません ただ、その内容が式の他の部分に隣接しているかどうかがテストされるだけです。
例えば、URL からプロトコルを抽出する、次のような式を考えてみましょう。
<cfset regex = "http(?=://)"><cfset string = "http://"><cfset result = reFind(regex, string, 1, "yes")>{{mid(string, result.pos1, result.len1)}} この例では、文字列 "http" が返されます。先読みの括弧を使用すると、"://" の存在は確認されますが、結果には "://" が含まれません。先読みを使用しなった場合は、結果に余分な "://" が含まれます。先読みの括弧はテキストを取得しないので、バックリファレンスの番号付けでは、これらのグループはスキップされます。後方参照について詳しくは、バックリファレンスの使用を参照してください。
(?!...) 正規表現の先頭でこれを指定すると、否定先読みが行われます。否定先読みは、(?=...) の肯定先読みに似ていますが、そのサブ式が存在しないかどうかがテストされる点が異なります。先読みの小括弧はテキストをキャプチャしないので、後方参照の番号付けでは、これらのグループはスキップされます。後方参照について詳しくは、バックリファレンスの使用を参照してください。
(?:...) サブ式に "?:" という接頭辞を付けると、バックリファレンスで使用するテキストとして取得されなくなります。それ以外は通常のサブ式と同様に機能します。

[a-z] のように文字セットで特殊文字を使用するときは、次の点に注意する必要があります。

  • ColdFusion では、ハイフン(-)は常に範囲記号として解釈されます。したがって、角括弧内の文字セットにリテラル文字としてハイフン(-)を含めたい場合は、通常の特殊文字のようにエスケープすることはできません。文字セットにリテラル文字のハイフン(-)を含めるには、文字セットの最後の文字として指定する必要があります。
  • 文字セットに右角括弧(])を含めるには、[1-3¥]A-z] のように円記号(¥)でエスケープします。文字セット指定子の外にある ] 文字は、エスケープする必要はありません。

エスケープシーケンスの使用

エスケープシーケンスとは、円記号(¥)が前にある正規表現の特殊文字です。エスケープシーケンスは、正規表現で特殊文字を表すのによく使用されます。たとえば、エスケープシーケンス ¥t は正規表現でのタブ記号を表します。エスケープシーケンス ¥d は [0-9] と同じで、任意の数字を表します。ColdFusion のエスケープシーケンスでは大文字と小文字が区別されます。
次の表に、ColdFusion でサポートされているエスケープシーケンスを示します。

エスケープシーケンス 説明
¥b 英数字から英数字以外、または英数字以外から英数字に変わる境界を指定します。例えば、文字列 " Big" では、スペース(英数字以外)と "B"(英数字)の間に境界があります。次の例では、正規表現にエスケープシーケンス ¥b が含まれているので、検索文字列の最後にある文字列 "Big" は検索されますが、単語 "ambiguous" の一部である "big" は検索されません。reFindNoCase("\bBig\b", "Don't be ambiguous about Big."){{<! --- The value of IndexOfOccurrence is 26 --->}} 文字セット内で使用すると([¥b] など)、バックスペースが指定されます。
¥B 文字タイプが変化しない境界を指定します。たとえば、英数字 2 文字または英数字以外の 2 文字が並んだ部分の境界に一致します。¥b とは逆です。
¥A 文字列の先頭のアンカーを指定します。特殊文字 ^ と似ていますが、^ とは異なり、¥A と (?m) を組み合わせても、検索文字列内の改行の先頭には一致しません。
¥Z 文字列の末尾のアンカーを指定します。特殊文字 $ に似ていますが、$ とは異なり、¥Z と (?m) を組み合わせても、検索文字列内の改行の末尾には一致しません。
¥n 改行文字
¥r キャリッジリターン
¥t タブ
¥f フォームフィード
¥d 任意の数字。[0-9] と同じです。
¥D 任意の非数字 文字。[^0-9] と同じです。
¥w 任意の英数字またはアンダースコア(_)。[[:word:]] と同じです。
¥W 英数字以外の任意の文字(アンダースコアを除く)。[^[:word:]] と同じです。
¥s タブ、スペース、改行文字、キャリッジリターン、フォームフィードなどの任意の空白文字。[ ¥t¥n¥r¥f] と同じです。
¥S 任意の非空白 文字。[^ \t\n\r\f] と同じです。
x 文字の 16 進表現d は 16 進数の数字です。
¥ddd

文字の 8 進表現。d は 8 進数の数字で、¥000~¥377 の 形式です。

文字クラスの使用

正規表現の文字セットには、文字クラスを含めることができます。文字クラスは、次の例のように角括弧で囲みます。

REReplace ("Adobe Web Site","[[:space:]]","*","ALL")

このコードでは、スペースがすべて * で置き換えられて、次の文字列が生成されます。

Adobe*Web*Site

文字クラスは、文字セット内で他の式と組み合わせることができます。例えば、正規表現 [[:space:]123] は、スペース、1、2、または 3 を検索します。次の例でも、正規表現内で文字クラスが使用されています。

"Some BIG string")>
<!--- The value of IndexOfOccurrence is 5 --->

次の表に、ColdFusion でサポートされている文字クラスを示します。これらのクラスを使用した正規表現は、ASCII または ISO-8859 の文字だけでなく、Unicode 文字にも一致します。

文字クラス 一致するもの
:alpha: 任意のアルファベット文字。
:upper: 任意の大文字のアルファベット文字。
:lower: 任意の小文字のアルファベット文字。
:digit: 任意の数字。¥d と同じです。
:alnum: 任意の英数字。
:xdigit: 任意の 16 進数字。[0-9A-Fa-f] と同じです。
:blank: スペースまたはタブ。
:space: 任意の空白文字。¥s と同じです。
:print: 任意の英数字、句読点、または空白文字。
:punct: 任意の句読点。
:graph: 任意の英数字または句読点。
:cntrl: [:upper:]、[:lower:]、[:alpha:]、[:digit:]、[:punct:]、[:graph:]、[:print:]、または [:xdigit:] の文字クラスに含まれない、任意の文字。
:word: 任意の英数字およびアンダースコア(_)。¥w と同じです。
:ascii: 16 進数で 0~7F の範囲の ASCII 文字。

本作品は Creative Commons Attribution-Noncommercial-Share Alike 3.0 Unported License によってライセンス許可を受けています。  Twitter™ および Facebook の投稿には、Creative Commons の規約内容は適用されません。

リーガルノーティス   |   プライバシーポリシー