2

文字列の先頭にある 1 ~ 3 桁に一致する SAS 正規表現を探しています。そのような数字シーケンスの後には、以下に示すように空白を付ける必要があります ( string1string2およびstring3):

data _null_;
string1='1   y';
string2='22  x';
string3='333 z';
string4='z1   y';
string5='2z  x';
rx=prxparse('/^\d????/');
if prxmatch(rx,string1) then put 'match';
if prxmatch(rx,string2) then put 'match';
if prxmatch(rx,string3) then put 'match';
if prxmatch(rx,string4) then put 'notmatch';
if prxmatch(rx,string5) then put 'notmatch';
run;
4

2 に答える 2

3

楽しみのために、いくつかの些細な非正規表現ソリューション(それぞれにデータ/望ましい結果に応じて弱点/強みがあります)...ここではこれらのほとんどで長さをチェックしません。 4 桁以上 (つまり、string1="1234 main" が失敗する場合) は、length() を介して追加します。

if notdigit(scan(string1,1)) then put 'no match';
if compress(scan(string,1),,'d') ne ' ' then put 'no match';

NOTDIGIT は、このようなものに最適な関数です。4 文字以上をチェックする必要がない場合、これはおそらく正規表現よりもはるかに高速なソリューションです。

また、提案 - SAS の場合、9.2 以降を使用している場合は、次のように正規表現を記述する必要があります。

rx=prxparse('/^\d{1,3}(?=\s)/o');

o は、正規表現を 1 回だけコンパイルするようコンパイラーに指示します。(これは古い 'retain and if _n_=1' メソッドを置き換えます。) また、3 桁の数字だけを一致させたい場合 (つまり、"333" が一致する場合)、\s の代わりに \b を使用することもできます。 \s は空白文字であり、\b は単語境界であり、\s に似ていますが、文字列マーカーの末尾も含みます。

于 2012-11-21T02:03:55.370 に答える
1

あなたが探しているものは少し不明ですが、この正規表現パターンが必要だと思います

^\d{1,3}(?=\s)
于 2012-11-20T23:18:33.037 に答える