s/regular-expression/replacement-string/
prxchange('s/world/planet/', 1, 'Hello world!');
Hello planet
となります。
prxchange('s/(\w+), (\w+)/$2 $1/',-1, 'Jones, Fred');
s/(\w+), (\w+)/$2 $1
です。一致の検索回数は–1です。ソース文字列は'Jones, Fred'です。値–1は、ソースの末尾に到達するまで一致したパターンを置換し続けることを指定します。
(XXX) XXX-XXXX
またはXXX-XXX-XXXX
のいずれかです。
data _null_; 1 if _N_ = 1 then do; paren = "\([2-9]\d\d\) ?[2-9]\d\d-\d\d\d\d"; 2 dash = "[2-9]\d\d-[2-9]\d\d-\d\d\d\d"; 3 expression = "/(" || paren || ")|(" || dash || ")/"; 4 retain re; re = prxparse(expression); 5 if missing(re) then 6 do; putlog "ERROR: Invalid expression " expression; 7 stop; end; end; length first last home business $ 16; input first last home business; if ^prxmatch(re, home) then 8 putlog "NOTE: Invalid home phone number for " first last home; if ^prxmatch(re, business) then 9 putlog "NOTE: Invalid business phone number for " first last business; datalines; Jerome Johnson (919)319-1677 (919)846-2198 Romeo Montague 800-899-2164 360-973-6201 Imani Rashid (508)852-2146 (508)366-9821 Palinor Kent . 919-782-3199 Ruby Archuleta . . Takei Ito 7042982145 . Tom Joad 209/963/2764 2099-66-8474 ; run;
1 | DATAステップを作成します。 | ||||||||||||
2 | (XXX)XXX-XXXXに一致する電話番号を識別するPerl正規表現を記述し、変数PARENを割り当てて結果を保持します。次の構文要素を使用してPerl正規表現を記述します。
|
||||||||||||
3 | XXX-XXX-XXXXに一致する電話番号を識別するPerl正規表現を記述し、変数DASHを割り当てて結果を保持します。 | ||||||||||||
4 | (XXX)XXX-XXXXとXXX—XXX—XXXXに一致する正規表現を連結するPerl正規表現を記述します。連結することで、両方の電話番号形式を1つの正規表現で検索できるようになります。
PARENとDASHの正規表現はかっこ内に配置されています。PARENとDASHの間にあるメタ文字の棒(|)は、コンパイラに対していずれかのパターンとの一致を指示します。パターン全体を囲むスラッシュは、正規表現の開始位置と終了位置をコンパイラに伝えます。
|
||||||||||||
5 | Perl正規表現をPRXPARSEに渡し、表現をコンパイルします。PRXPARSEはコンパイルされたパターンに対して値を返します。他のPerl正規表現の関数とCALLルーチンで値を使用し、コンパイルされたPerl正規表現を使った処理をSASで実行できます。 | ||||||||||||
6 | MISSING関数で正規表現が正常にコンパイルされたかどうかを確認します。 | ||||||||||||
7 | PUTLOGステートメントを使用し、正規表現がコンパイルされなかった場合はエラーメッセージをSASログに書き込みます。 | ||||||||||||
8 | 有効な自宅電話番号を検索します。PRXMATCHはPRXPARSEからの値を検索テキストと合わせて使用し、検索テキストで正規表現が検出された位置を返します。自宅電話番号との一致がない場合、PUTLOGステートメントはSASログにメモを書き込みます。 | ||||||||||||
9 | 有効な会社電話番号を検索します。PRXMATCHはPRXPARSEからの値を検索テキストと合わせて使用し、検索テキストで正規表現が検出された位置を返します。会社電話番号との一致がない場合、PUTLOGステートメントはSASログにメモを書き込みます。 |
NOTE:Invalid home phone number for Palinor Kent NOTE:Invalid home phone number for Ruby Archuleta NOTE:Invalid business phone number for Ruby Archuleta NOTE:Invalid home phone number for Takei Ito 7042982145 NOTE:Invalid business phone number for Takei Ito NOTE:Invalid home phone number for Tom Joad 209/963/2764 NOTE:Invalid business phone number for Tom Joad 2099-66-8474
<
に置換します。これはテキストをHTMLに変換するときに一般的に行われる置換処理です。
data _null_; 1 input; 2 _infile_ = prxchange('s/</</', -1, _infile_); 3 put _infile_; 4 datalines; 5 x + y < 15 x < 10 < y y < 11 ; run;
1 | DATAステップを作成します。 |
2 | SAS変数を作成しないで、入力バッファに入力データレコードを入れます。 |
3 | PRXCHANGEルーチンを呼び出し、パターンによる置換を実行します。正規表現の形式はs/regular-expression/replacement-text/ です。正規表現の前のs は、これが置換正規表現であることを示します。–1はPRXCHANGEに渡される特別な値で、置換できるものはすべて置換することを示します。
|
4 | PUTステートメントの_INFILE_オプションを使用し、現在の出力行をログに書き込みます。 |
5 | 入力ファイルを識別します。 |
x + y < 15 x < 10 < y y < 11
text_lines
を読み込み、列line
のテキストを置換し、結果をhtml_line
という名前の列に配置します。proc sql; select prxchange('s/</</', -1, line) as html_line from text_lines; quit;
data _null_; 1 if _N_ = 1 then do; paren = "\(([2-9]\d\d)\) ?[2-9]\d\d-\d\d\d\d"; 2 dash = "([2-9]\d\d)-[2-9]\d\d-\d\d\d\d"; 3 regexp = "/(" || paren || ")|(" || dash || ")/"; 4 retain re; re = prxparse(regexp); 5 if missing(re) then 6 do; putlog "ERROR: Invalid regexp " regexp; 7 stop; end; retain areacode_re; areacode_re = prxparse("/828|336|704|910|919|252/"); 8 if missing(areacode_re) then do; putlog "ERROR: Invalid area code regexp"; stop; end; end; length first last home business $ 25; length areacode $ 3; input first last home business; if ^prxmatch(re, home) then putlog "NOTE: Invalid home phone number for " first last home; if prxmatch(re, business) then 9 do; which_format = prxparen(re); 10 call prxposn(re, which_format, pos, len); 11 areacode = substr(business, pos, len); if prxmatch(areacode_re, areacode) then 12 put "In North Carolina: " first last business; end; else putlog "NOTE: Invalid business phone number for " first last business; datalines; Jerome Johnson (919)319-1677 (919)846-2198 Romeo Montague 800-899-2164 360-973-6201 Imani Rashid (508)852-2146 (508)366-9821 Palinor Kent 704-782-4673 704-782-3199 Ruby Archuleta 905-384-2839 905-328-3892 Takei Ito 704-298-2145 704-298-4738 Tom Joad 515-372-4829 515-389-2838 ;
1 | DATAステップを作成します。 | ||||||||||||
2 | (XXX)XXX-XXXXに一致する電話番号を識別するPerl正規表現を記述し、変数PARENを割り当てて結果を保持します。次の構文要素を使用してPerl正規表現を記述します。
|
||||||||||||
3 | XXX-XXX-XXXXに一致する電話番号を識別するPerl正規表現を記述し、変数DASHを割り当てて結果を保持します。 | ||||||||||||
4 | (XXX)XXX-XXXXとXXX—XXX—XXXXに一致する正規表現を連結するPerl正規表現を記述します。連結することで、両方の電話番号形式を1つの正規表現で検索できるようになります。
PARENとDASHの正規表現はかっこ内に配置されています。PARENとDASHの間にあるメタ文字の棒(|)は、コンパイラに対していずれかのパターンとの一致を指示します。パターン全体を囲むスラッシュは、正規表現の開始位置と終了位置をコンパイラに伝えます。
|
||||||||||||
5 | Perl正規表現をPRXPARSEに渡し、表現をコンパイルします。PRXPARSEはコンパイルされたパターンに対して値を返します。他のPerl正規表現の関数とCALLルーチンで値を使用し、コンパイルされたPerl正規表現を使った処理をSASで実行できます。 | ||||||||||||
6 | MISSING関数で正規表現がエラーなしにコンパイルされたかどうかを確認します。 | ||||||||||||
7 | PUTLOGステートメントを使用し、正規表現がコンパイルされなかった場合はエラーメッセージをSASログに書き込みます。 | ||||||||||||
8 | 有効なノースカロライナ州の市外局番を文字列から検索するPerl正規表現をコンパイルします。 | ||||||||||||
9 | 有効な会社電話番号を検索します。 | ||||||||||||
10 | PRXPAREN関数でどちらの部分一致を使うかを判定します。PRXPARENは一致した最後の部分一致を返します。市外局番が(XXX)形式に一致すると、PRXPARENは値2を返します。市外局番がXXX形式に一致すると、PRXPARENは値4を返します。 | ||||||||||||
11 | PRXPOSNルーチンを呼び出し、部分一致の位置と長さを取得します。 | ||||||||||||
12 | PRXMATCH関数で市外局番が正しいノースカロライナ州の市外局番かどうかを判定し、ログへオブザベーションを書き込みます。 |
In North Carolina:Jerome Johnson (919)846-2198 In North Carolina:Palinor Kent 704-782-3199 In North Carolina:Takei Ito 704-298-4738
data _null_; 1 length first last phone $ 16; retain re; if _N_ = 1 then do; 2 re=prxparse("/\(([2-9]\d\d)\) ?[2-9]\d\d-\d\d\d\d/"); 3 end; input first last phone & 16.; if prxmatch(re, phone) then do; 4 area_code = prxposn(re, 1, phone); 5 if area_code ^in ("828" "336" "704" "910" "919" "252") then putlog "NOTE: Not in North Carolina: " first last phone; 6 end; datalines; 7 Thomas Archer (919)319-1677 Lucy Mallory (800)899-2164 Tom Joad (508)852-2146 Laurie Jorgensen (252)352-7583 ; run;
1 | DATAステップを作成します。 | ||||||||||||||||||||||||||||||||||||
2 | これが最初のレコードの場合、reの値を検索します。 | ||||||||||||||||||||||||||||||||||||
3 | パターンマッチングを行うPerl正規表現を記述します。次の構文要素を使用してPerl正規表現を記述します。
|
||||||||||||||||||||||||||||||||||||
4 | 文字列が開始する位置を返します。 | ||||||||||||||||||||||||||||||||||||
5 | 市外局番が開始する位置を識別します。 | ||||||||||||||||||||||||||||||||||||
6 | リストから市外局番を検索します。市外局番が有効なノースカロライナ州の番号でない場合、PUTLOGステートメントを使用してSASログにメモを書き込みます。 | ||||||||||||||||||||||||||||||||||||
7 | 入力ファイルを識別します。 |
NOTE:Not in North Carolina:Lucy Mallory (800)899-2164 NOTE:Not in North Carolina:Tom Joad (508)852-2146