2017-01-31 5 views
0

変数はt14-1-1、t14-1-1A、t14-2-1-1、t14-2-4-15A、以下のカード明細書に記載されているように。文字列内の任意の1桁をSASの先行0に置き換えます。

私が必要とするのは、sas形式のz2で行うように、先頭の0の文字列の任意の1桁を埋め込むことです。私は必要なもの

data test01; 
    input have $40.; 

    want02=prxchange('s/(^|-)\d($|-)*/\10\2/',-1,strip(have)); 
    want03=prxchange('s/(^|-)\d($|-)*(.+)/\10\2/',-1,strip(have)); 

    cards; 
    t14-1-1 
    t14-1-1A 
    t14-2-1-1 
    t14-2-1-1A 
    t14-2-4-15A 
    t14-2-4-15B 
    t14-2-4-16 
    t14-2-4-17 
    t14-2-4-17A 
    t14-2-4-17B 
    l16-2-9-1-1 
    l16-2-9-2-1 
    l16-2-9-2-2 
    ; 
run; 

は以下の通りです:

t14-01-01 
t14-01-01A 
t14-02-01-01 
t14-02-01-01A 
t14-02-04-15A 
t14-02-04-15B 
t14-02-04-16 
t14-02-04-17 
t14-02-04-17A 
t14-02-04-17B 
l16-02-09-01-01 
l16-02-09-02-01 
l16-02-09-02-02 

私は配列とスキャン、長さとtranward機能でこれを行う方法を知っています。私はこれがprxchange(正規表現)によって複雑さの少ないいくつかのステップで実行できるかどうか疑問に思っていました。

私は運と運命の異なる順列と組み合わせで多くを試しました。

アドバンスのおかげでよろしく!

答えて

2

私はそれがない場合、このジョブを実行する必要があり、SASの正規表現の風味がlookarroundをサポートしている場合は知らない:

  • 検索:(?<=-)(\d)(?!\d)
  • 置き換える:0$1

  • (?<=-)は、
  • (\d)前にダッシュをaveのは、グループ内の1
  • (?!\d)を撮影し、単一の数字は、我々は彼らが、
+1

うん後に数字を持っていないことを確認してください否定先読みです。 'want02 = prxchange( 's /(?<= - )(\ d)(?!\ d)/ 0 $ 1 /'、-1、strip(have)); – Joe

+0

@Toto、ありがとうございました!これは魅力のように機能します。 –

+0

@Joe、確認もありがとう! :) –

関連する問題