正規表現、パート1
この記事シリーズのパート1では、SQLおよび正規表現を使用してストリング内の文字を置換する方法を紹介します。RPGまたはSQLを使用しても文字を置換することはできますし、それらは十分に機能しますが、正規表現を使用した方が多少簡単だと思われるケースもいくつかあります。
ここで示す例では、REGEXP_REPLACE関数を使用します。REGEXP_REPLACE関数は、ストリング内で指定した値を検索し、それを別の値に置換します。
1つ目の例では(図1)、文字と数字の両方が含まれているストリングを検索して、数字またはピリオドのみを抽出しようとしています。この目的を実現するために、REGEXP_REPLACEを使用して、数字ではない文字を置換します。
では、この例を少し分解して見てみましょう。1つ目の引数は、その中で検索が行われるストリングを指定します。本番プログラムでは、これはおそらく、ファイルや表からの変数またはフィールドとなるでしょう。2つ目の引数は、そのストリング内で見つけようとしているものを示します。キャレット記号(^)は、「not(~ではない)」を意味します。「0-9.」は、検索結果に0~9の数字とピリオド記号(.)が含まれるようにするという意味です。3つ目の引数は、使用される置換文字です。このケースでは、検索で何かが見つかっても、それを何にも置換しません。注意すべきは、スペースではないということです。このケースでは、トリミングと同じ働きをすることになります。
このステートメントが行っている処理を文にしてまとめると、ストリング内で、0~9およびピリオドではない文字を探すということになります。ACSでこの例を実行すると、図2に示す結果が得られます。
このステートメントの結果は「530」であり、これは私が期待していた通りのものです。
次の例は、RPGプログラムからPythonスクリプトへパラメーターを送る際に、偶然見つけた課題の例です。渡される値にドル記号($)が含まれているため、Pythonスクリプトに渡されたときに、値が切り捨てられてしまっていました。変数の内容全体が送られるように、Pythonスクリプトへ送る前にRPGプログラムでドル記号をエスケープすることができる必要がありました。図3に、そのタスクを実行するためにコーディングした正規表現を示します。
この例では、ストリング内でドル記号を検索し(2つ目の引数で示されています)、ドル記号を、エスケープ文字となる2つのバックスラッシュとドル記号に置換しています。これを実行すると、図4に示す結果が得られます。
RPGプログラムでそうしたステートメントを使用してから、Pythonへ変数を送ることは、まさに私が必要としていた通りの処理でした。Pythonスクリプトも期待した通りに実行されました。
正規表現は、私の道具箱に加わった実に強力な機能の1つでした。プログラムの中で、それらをますます使用するようになっています。この記事シリーズのパート2では、IBM i で利用できる、その他の正規表現関数をいくつか紹介するつもりです。