前のページ|次のページ

PRXMATCH関数

パターンの一致を検索し、見つかったパターンの位置を返します。

カテゴリ: 文字列マッチング
制限事項: regular-expression-id引数を使用する場合、この引数にはDBCS互換性がないPRXPARSE関数が必要なため、DBCSおよびMBCSデータは処理できません。

構文

必須引数

regular-expression-id

PRXPARSE関数によって返されるパターン識別子の値が含まれる数値変数を指定します。

制限事項 この引数を使用する場合、PRXPARSE関数も使用する必要があります。

perl-regular-expression

Perl正規表現を値とする文字定数、変数または式を指定します。

source

検索する文字定数、変数または式を指定します。

詳細

基本

regular-expression-idを使用する場合、PRXMATCH関数はPRXPARSEによって返されたregular-expression-idsourceを検索し、文字列の開始位置を返します。一致が見つからない場合、PRXMATCHは0を返します。
perl-regular-expressionを使用する場合、PRXMATCHはperl-regular-expressionsourceを検索し、PRXPARSEを呼び出す必要はありません。
WHERE句とPROC SQLで、PRXMATCHにPerl正規表現を使用できます。パターンマッチングの詳細については、 Perl正規表現(PRX)を使用したパターンマッチング を参照してください。

Perl正規表現のコンパイル

perl-regular-expressionが定数の場合、または/oオプションを使用する場合、Perl正規表現は1回のみコンパイルされ、PRXMATCHを使用するたびにそのコンパイル済みの正規表現が再利用されます。perl-regular-expressionが定数ではなく、/oオプションを使用しない場合、PRXMATCHを呼び出すたびにPerl正規表現が再コンパイルされます。
注: コンパイル1回のみの動作は、DATAステップのWHERE句またはPROC SQLでPRXMATCHを使用する場合に発生します。他のすべての使用では、PRXMATCHを呼び出すたびにperl-regular-expressionが再コンパイルされます。

比較

Perl正規表現(PRX)の関数とCALLルーチンは、連携してパターンと一致する文字列を操作します。これらの関数およびCALLルーチンのリストと概要説明については、カテゴリ別のSAS関数とCALLルーチンの文字列マッチングカテゴリを参照してください。

例1: PRXPARSEを使用した部分文字列の位置の検索

次の例では、文字列から部分文字列を検索し、その部分文字列の文字列内の位置を返します。
/* For release 9.0: the following example makes a call to PRXPARSE. */
  /* For release 9.1, no call is required. */ 
data _null_;
      /* Use PRXPARSE to compile the Perl regular expression.    */
   patternID=prxparse('/world/');
      /* Use PRXMATCH to find the position of the pattern match. */
   position=prxmatch(patternID, 'Hello world!');
   put position=;
run;
次の出力がログに書き込まれます。
position=7

例2: Perl正規表現を使用した部分文字列の位置の検索

次の例では、Perl正規表現を使用して文字列(Hello world)から部分文字列(world)を検索し、その部分文字列の文字列内の位置を返します。
data _null_;
      /* Use PRXMATCH to find the position of the pattern match. */
   position=prxmatch('/world/', 'Hello world!');
   put position=;
run;
次の出力がログに書き込まれます。
position=7

例3: 文字列内の部分文字列の位置の検索:複雑な例

次の例では、複数のPerl正規表現関数とCALLルーチンを使用して、文字列内の部分文字列の位置を検索します。
data _null_;
   if _N_=1 then
   do;
      retain PerlExpression;
      pattern="/(\d+):(\d\d)(?:\.(\d+))?/";
      PerlExpression=prxparse(pattern);
   end;
  
   array match[3] $ 8;
   input minsec $80.;
   position=prxmatch(PerlExpression, minsec);
   if position ^= 0 then
   do;
      do i=1 to prxparen(PerlExpression);
         call prxposn(PerlExpression, i, start, length);
         if start ^= 0 then
            match[i]=substr(minsec, start, length);
      end;
      put match[1] "minutes, " match[2] "seconds" @;
      if ^missing(match[3]) then
         put ", " match[3] "milliseconds";
   end;
   datalines;
14:56.456
45:32
;
run;
次の出力がログに書き込まれます。
14 minutes, 56 seconds, 456 milliseconds 45 minutes, 32 seconds

例4: DATAステップを使用した郵便番号の抽出

次の例では、DATAステップを使用して9桁の郵便番号のデータセットから各オブザベーションを検索し、それらのオブザベーションをデータセットZipPlus4に書き込みます。
data ZipCodes;
   input name: $16. zip:$10.;
   datalines;
Johnathan 32523-2343
Seth 85030
Kim 39204
Samuel 93849-3843
;
   /* Extract ZIP+4 ZIP codes with the DATA step. */
data ZipPlus4;
   set ZipCodes;
   where prxmatch('/\d{5}-\d{4}/', zip);
run;
proc print data=ZipPlus4;
run;
DATAステップからの郵便番号の出力
DATAステップからの郵便番号の出力

例5: PROC SQLを使用した郵便番号の抽出

次の例では、9桁の郵便番号のデータセットから各オブザベーションを検索し、それらのオブザベーションをデータセットZipPlus4に書き込みます。
data ZipCodes;
   input name: $16. zip:$10.;
   datalines;
Johnathan 32523-2343
Seth 85030
Kim 39204
Samuel 93849-3843
;
   /* Extract ZIP+4 ZIP codes with PROC SQL. */
proc sql;
   create table ZipPlus4 as
   select * from ZipCodes 
   where prxmatch('/\d{5}-\d{4}/', zip);
run;
proc print data=ZipPlus4;
run;
PROC SQLからの郵便番号の出力
PROC SQLからの郵便番号の出力

関連項目:

前のページ|次のページ|ページの先頭へ