REGEXREPLACE( ) 関数

正規表現と一致する文字列のすべてのインスタンスを新しい文字列で置き換えます。

構文

REGEXREPLACE(文字列, パターン, 新しい文字列)

パラメーター

名前 種類 説明
文字列

文字

パターンとの一致をテストするフィールド、式、またはリテラル値。
パターン

文字

検索するパターン文字列(正規表現)。

パターンには、リテラル文字、メタ文字、またはこれら 2 つの組み合わせを指定できます。リテラル文字には、すべての英数字、一部の句読点、および空白が含まれます。

検索は大文字と小文字を区別します。つまり、英字の大文字と小文字は明確に指定しなければならないということです。

新しい文字列 文字

パターンと一致するすべての値と置き換える文字列。

置換文字列には、リテラル文字、元の文字列に基づく文字のグループ($int 要素を使用)、またはこれら 2 つの組み合わせを含めることができます。

出力

文字。

基本的な例

スペースを操作する

次の例では、文字列間の複数のスペースを単一スペースに置換することで、"AB CD EF" が返されます。

REGEXREPLACE("AB CD   EF", "\s+", " ")

文字フィールドのデータに対し、単語間の間隔を単一スペースに統一したデータが返されます。

REGEXREPLACE(文字フィールド, "\s+", " ")

文字フィールドのデータに対し、単語間の間隔を単一スペースに統一したデータが返されます。新しい文字列としてリテラル スペースの代わりに BLANKS( ) 関数を使用すると、スペースが視認しやすくなり、見落とされる可能性が低くなります。

REGEXREPLACE(character_field, "\s+", BLANKS(1))

電話番号を標準的な書式にする

"(123) 456-7890" が返されます。つまり、電話番号 '1234567890' が標準的な書式に置き換えられました。

REGEXREPLACE(SUBSTR("1234567890",1,14), "(\d{3})[\s-]*(\d{3})[\s-]*(\d{4})","($1) $2-$3")

Telephone_Number フィールド内の数字を標準的な書式にした値が返されます。

REGEXREPLACE(Telephone_Number, ".*(\d{3})[\s-\.\)]*(\d{3})[\s-\.]*(\d{4})", "($1) $2-$3")

テキストから "123-456-7890" が抽出されます。

REGEXREPLACE("Tel num: 123-456-7890 (office)", "(.*)(\d{3}[\s-\)\.]*\d{3}[\s-\.]*\d{4})(.*)", "$2")

Comment フィールドのテキスト内から電話番号を抽出し、標準的な書式に置き換えます。

REGEXREPLACE(Comment, "(.*)(\d{3})[\s-\)\.]*(\d{3})[\s-\.]*(\d{4})(.*)","($2) $3-$4")

一般的な書式を抽出する

文字列("1ABC-123aa")によって指定された値の一般的な書式を示す "9XXX-999xx" が返されます。

REGEXREPLACE(REGEXREPLACE(REGEXREPLACE("1ABC-123aa","\d","9"),"[a-z]","x"),"[A-Z]", "X")

Invoice_Number フィールド内のすべての識別子の一般的な書式が返されます。

REGEXREPLACE(REGEXREPLACE(REGEXREPLACE(Invoice_Number,"\d","9"),"[a-z]","x"),"[A-Z]", "X")

氏名を標準的な書式に置き換える

"John David Smith" が返されます。

REGEXREPLACE("Smith, John David", "^(\w+),(\s\w+)(\s\w+)?(\s\w+)?","$2$3$4 $1")

Full_Name フィールド内の氏名の構成要素が正式な順序である「ファーストミドル) (ミドルラスト」として返されます。

REGEXREPLACE(Full_Name, "^(\w+),(\s\w+)(\s\w+)?(\s\w+)?","$2$3$4 $1")

メモ

氏名のデータには、アポストロフィが入った名前など、さまざまな要素の複雑な結合が存在していることがあります。氏名のデータにおける変化が多ければ、必要となる正規表現はこの例で提供されているものより通常、複雑になります。

備考

機能の仕組み

REGEXREPLACE( ) 関数では、正規表現を使って、データ内で一致するパターンを見つけ、その一致する値を新しい文字列で置き換えることができます。

例:

REGEXREPLACE(文字フィールド, "\s+", " ")

これは、テキスト文字の間にある 1 つ以上のスペースを単一のスペースに置き換えることにより、文字データにおける間隔を標準化しています。

REGEXREPLACE( ) 関数の検索部分は、REGEXFIND( ) 関数の検索部分と同じです。両方の関数に共通する検索機能の詳細については、REGEXFIND( ) 関数を参照してください。

REGEXREPLACE( ) の使用に適する場面

REGEXREPLACE( ) は、Analytics でシンプルまたは複雑なパターン一致を使ってデータを検索、置換したい場合に使用できます。

文字列をそれ自体に置換する

$int 要素を使用すると、文字列をそれ自体に置換できます。これにより、意味のあるデータ部分を維持しながら、周囲のデータや混合されたデータを標準化または省略することが可能になります。

上には、電話番号と名前を使用するいくつかの例が示されています。

$int 要素を使用するには、まずパターン値をかっこ ( ) で囲むことでグループを作成する必要があります。詳細については、REGEXFIND( ) 関数を参照してください。

文字の順次の照合を避ける

REGEXREPLACE( ) 関数を入れ子にすることで、文字の順次の照合を避け、他の部分文字列との位置関係にかかわらず、部分文字列を置き換えることができます。

次の 2 つの例における課題は、数字と文字がランダムな順序で出現している英数字のソース データから一般的な書式を抽出することです。このように数字と文字の順序が不明な場合、どのようにしてパターン文字列を指定できるでしょうか?

解決策は、以下に例を示すように、まず内側の REGEXREPLACE( ) 関数を使って数字を検索、置換し、次に外側の REGEXREPLACE( ) 関数を使って文字を検索、置換することです。

次の例の場合には、"999XXX" が返されます。

REGEXREPLACE(REGEXREPLACE("123ABC","\d","9"),"[A-Z]","X")

次の例の場合には、"9X9X9X" が返されます。

REGEXREPLACE(REGEXREPLACE("1A2B3C","\d","9"),"[A-Z]","X")

置換文字列の長さと切り詰め

REGEXREPLACE( ) を使用して演算フィールドを作成した場合、演算フィールドの長さは元のフィールドの長さと同じになります。

置換文字列の長さがターゲット文字列の長さを超えており、文字列全体の長さが増えた場合、その増えた文字列の長さを演算フィールドの長さに収めることができないときには、文字列が切り詰められます。

まず、ターゲット文字列の末尾の文字から切り詰められ、次に置換文字列の末尾から切り詰められます。以下に切り詰めの例を示します。

文字列

パターン

新しい文字列

フィールド長

結果

切り詰め後の文字

x123x

123

A

5

xAx

なし

x123x

123

ABC

5

xABCx

なし

x123x

123

ABCD

5

xABCD

x

x123x

123

ABCDE

5

xABCD

x、E

x123x

123

ABCDE

6

xABCDE

x

x123x

123

ABCDE

7

xABCDEx

なし

切り詰めを避ける方法

切り詰められないようにするには SUBSTR( ) 関数を使用してフィールド長を大きくしておきます。次の 2 番目の例を参照してください。

置換文字列 "E" と既存の文字 "x" を切り捨てた "xABCD" が返されます。

REGEXREPLACE("x123x","123","ABCDE")

すべての置換文字列と、置換されなかった既存の文字列で構成される、"xABCDEx" が返されます。

REGEXREPLACE(SUBSTR("x123x",1,10),"123","ABCDE")

正規表現のメタ文字

次の表は、REGEXFIND( ) および REGEXREPLACE( ) で使用できるメタ文字の一覧と、それぞれのメタ文字で実行される操作を示しています。

このほかの正規表現構文もあって、 Analytics でサポートされていますが、もっと複雑です。それらの構文の完全な説明はこのガイドには記載されていません。正規表現について説明している多数のリソースがインターネットで入手できます。

Analytics は、ECMAScript の正規表現の実装を使用しています。ほとんどの正規表現の実装は、共通のコア構文を使用しています。

メモ

Analytics における現在の正規表現の実装は、英語以外の言語の検索を完全にサポートしていません。

メタ文字

説明

.

任意の 1 文字に一致します(改行文字を除く)。

?

直前のリテラル、メタ文字、または要素と 0 回または 1 回一致します。

*

直前のリテラル、メタ文字、または要素と 0 回以上一致します。

+

直前のリテラル、メタ文字、または要素と 1 回以上一致します。

{}

直前のリテラル、メタ文字、または要素と指定した回数一致します。正確な数、範囲、または終わりが決められていない範囲を指定できます。

例:

  • a{3} は "aaa" と一致します。

  • X{0,2}L は "L"、"XL"、および "XXL" と一致します。

  • AB-\d{2,}-YZ は、英数字の識別子で、接頭辞に "AB-"、接尾辞に "-YZ"、および本体部分に 2 つ以上の数字を持つすべての識別子と一致します。

[]

角かっこで囲まれた文字の中のいずれかに一致します。

例:

  • [aeiou] は a、e、i、o、または u と一致します。

  • [^aeiou] は a、e、i、o、または u 以外の文字と一致します。

  • [A-G] は大文字の英字 A から G の範囲にある任意の文字と一致します。

  • [A-Ga-g] は大文字の英字 A から G、または小文字の英字 a から g の範囲にある任意の文字と一致します。

  • [5-9] は 5 から 9 の範囲にある任意の数字と一致します。

()

文字の並びまたはブロックを定義するグループを作成します。その後、グループは単一ユニットとして扱うことができます。

例:

  • S(ch)?mid?th? これは、"Smith" または "Schmidt" と一致します。

  • (56A.*){2} は、"56A" の並びが少なくとも 2 回出現するすべての英数字の識別子と一致します。

  • (56A).*-.*\1 は、"56A" の並びが少なくとも 2 回出現し、2 つの出現の間にハイフンがあるすべての英数字の識別子と一致します。

\

エスケープ文字は、直後の文字がリテラルであることを示します。メタ文字と文字どおり一致させたい場合は、エスケープ文字を使用します。たとえば、\( は左かっこを見つけ、\\ はバックスラッシュを見つけます。

次の文字のいずれかと完全に一致させたい場合は、エスケープ文字を使用します。

^ $ . * + ? = ! : | \ ( ) [ ] { }

アンパサンド(&)やアットマーク(@)などの他の句読点文字は、エスケープ文字を必要としません。

\int

前にかっこ ( ) を使って定義したグループを繰り返し使用することを指定します。int は、前に定義したグループの、その他のグループからの位置(先頭から数える)を特定する整数です。このメタ文字は、REGEXFIND( ) と REGEXREPLACE( ) いずれのパターン パラメーターでも使用できます。

例:

  • (123).*\1 は、数字 "123" のグループが少なくとも 2 回出現するすべての識別子と一致します。

  • ^(\d{3}).*\1 は、先頭の 3 桁の数字が繰り返し現れるすべての識別子と一致します。

  • ^(\d{3}).*\1.*\1 は、先頭の 3 桁の数字が繰り返し少なくとも 2 回現れるすべての識別子と一致します。

  • ^(\D)(\d)-.*\2\1 は、先頭の英字と数字が反転して再び現れるすべての識別子と一致します。

$int

ターゲット文字列で見つかったグループが置換文字列として使用されることを指定します。int は、対象文字列における、そのグループの、その他のグループからの位置(先頭から数える)を特定する整数です。このメタ文字は、REGEXREPLACE( ) の新しい文字列パラメーターで使用できます。

例:

  • さまざまな電話番号の表示形式と一致させるために (\d{3})[ -]?(\d{3})[ -]?(\d{4}) というパターンを使用している場合、新しい文字列として ($1)-$2-$3 を使用すると、それ自体を数字と置き換えて、表示形式を標準化することができます。999 123-4567 と 9991234567 はどちらも (999)-123-4567 になります。

|

パイプ(|)の前後にある文字、文字のブロック、または式と一致します。

例:

  • a|b は a または b と一致します。

  • abc|def は "abc" または "def" と一致します。

  • Sm(i|y)th は "Smith" または "Smyth" と一致します。

  • [a-c]|[Q-S]|[x-z] は a、b、c、Q、R、S、x、y、z のいずれかの文字と一致します。

  • \s|- は空白文字またはハイフンと一致します。

\w

単語に使用される任意の文字と一致します(a から z、A から Z、0 から 9、およびアンダースコア _)。

\W

単語に使用される文字以外の任意の文字と一致します(a から z、A から Z、0 から 9、またはアンダースコア _ 以外)。

\d

任意の数字(10 進数字)と一致します。

\D

10 進数字以外の任意の 1 文字と一致します。

\s

スペース(空白文字)と一致します。

\S

空白文字以外の任意の文字と一致します。

\b

単語の境界(\w 文字と \W 文字の間)と一致します。

単語の境界自体に領域は取りません。例:

  • "United Equipment" には単語の境界が 4 つあります。スペースの左右に 1 つずつと、文字列のはじめと終わりに 1 つずつです。"United Equipment" は、正規表現 \b\w*\b\W\b\w*\b と一致します。

ヒント

単語の境界は、単語を区切るスペース以外の、カンマやピリオドなどの文字によっても区切ることができます。

たとえば、次の式は True と評価されます。

REGEXFIND("jsmith@example.net", "\bexample\b")

^

文字列の先頭と一致します。

角かっこ [ ] 内では、^ は指定内容の否定になります。

$

文字列の末尾と一致します。

関連する関数

一致パターンを置換せずに検索したいだけの場合は、REGEXFIND( ) 関数 を使用します。

ACL のスクリプト作成ガイド 14.1