ADP
Programming Language ADP

Japanese

Freecode

Sourceforge.net

SourceForge.JP

Loading

文字列操作・正規表現

文字列の操作および正規表現の述語になります。

文字列の操作述語の名称はbasicをモデルにしています。
ascii / chr / left / right / mid / instr / replace / replace first / split / trim

replace述語は全文字列の置換を行います。最初の一つだけ置換したい場合は、replace_firstを使用します。
C言語(および多くの言語で使用されている)sprintf 述語があります。

正規表現に関する述語は、正規表現の検索(search)および置換(regex_replace /
regex_replace_first)になります。

その他、sha1(SHA1ハッシュの作成)、rkey(ランダムなキーの作成)、now(時刻の文字列取得)、urlencode/urldecode があります。

文字列操作・正規表現リファレンス

ascii (文字コードの取得)

形式
 ascii( $str, $value)
引数
  • $str: 文字コードを取得する文字
  • $value: 結果(文字コードの値)
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 指定された文字列の先頭バイトの文字コードを取得します。
注)バイト単位で返しますので漢字コード等の複数バイトにまたがる文字に関しては複数回に分けて
asciiを呼び出す必要があります。

コード例(lib/ascii.p)
,ascii('A').prt;

実行例
D:\sample\lib>adp ascii.p
65

cat (文字列の結合)

形式
 cat( $src, ..., $dst)
引数
  • $src: 結合する文字列(複数可)
  • $dst: 結果
完了時の動作
  • 正常時:次の述語を実行に移ります。
  • 異常時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
文字列を結合します。結合する文字列を指定します。最後の引数に結果が格納されます。
引数に無効な値(文字列に変換できない)を指定するとバックトラックします。

コード例 (lib/cat.p)
,cat( 'This ', 'is ', 'a ', 'pen.').prt;

実行例
D:\sample\lib>adp cat.p
This is a pen.

chr (文字コードから文字の取得)

形式
 chr( $code, $value)
引数
  • $code: 文字コード値
  • $value: 結果(文字コードが示す文字)
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
 指定された文字コードの文字を返します。0?255で指定する必要があります。これ以上のサイズの文字コードは分割して設定する必要があります。文字コードの正当性のチェック等は行いません。

コード例(lib/chr.p)
,chr(0x41).prt;

実行例
D:\sample\lib>adp chr.p
A

euc2sjis

futf8

MAC OS LIONでカレントロケールがutf8以外では動作しない。

instr (部分文字列の検索)

形式
 instr( $src, $findstr, $start, $pos)
引数
  • $src: 文字列
  • $findstr: 検索文字列
  • $start: 開始位置(バイト)(省略可)
  • $pos: 結果(バイト)
完了時の動作
  • 文字列が見つかった場合:次の述語を実行に移ります。
  • 文字列が見つからなかった場合:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明

$srcで指定された文字列から$findstrで指定された文字列を検索します。
検索は文字列の先頭から終端に向かって行われます。逆向きの検索を行う場合はinstrrevを使用します。
結果の位置は、$pos(バイト単位)に格納されます。検索開始位置を$start(バイト単位)で指定することもできます。
みつからなかったらバックトラックします。


コード例 (lib/instr.p)
+t('This is a pen. I have the pen. I give you the pen.');
,t.instr('pen').prtn,next;
,prtn;
,t.instr('pen',10).prtn,next;
,prtn;
,t.instr('pen',11).prtn,next;
,prtn;

実行例
D:\sample\lib>adp instr.p
10
26
46

10
26
46

26
46

instrrev (部分文字列の逆向き検索)

形式
 instrrev( $src, $findstr, $start, $pos)
引数
  • $src: 文字列
  • $findstr: 検索文字列
  • $start: 開始位置(バイト)(省略可)
  • $pos: 結果(バイト)
完了時の動作
  • 文字列が見つかった場合:次の述語を実行に移ります。
  • 文字列が見つからなかった場合:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明

$srcで指定された文字列から$findstrで指定された文字列を検索します。
instrと異なり、検索は文字列の終端から先頭に向かって行われます。
結果の位置は、$pos(バイト単位)に格納されます。検索開始位置を$start(バイト単位)で指定することもできます(指定された位置より前で検索します)。
みつからなかったらバックトラックします。


コード例 (lib/instrrev.p)
+t('This is a pen. I have the pen. I give you the pen.');
,t.instrrev('pen').prtn,next;
,prtn;
,t.instrrev('pen',30).prtn,next;
,prtn;
,t.instrrev('pen',10).prtn,next;

実行例
D:\sample\lib>adp instrrev.p
46
26
10

26
10

10

left (左からの部分文字列の取得)

形式
 left( $src, $cnt, $dst)
引数
  • $src: 文字列
  • $cnt: バイト数
  • $dst: 結果
完了時の動作
  • 正常時:次の述語を実行に移ります。
  • 異常時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された文字列を先頭から$cntバイト取得し、$dstに格納します。
引数に無効な値を指定するとバックトラックします。

コード例 (lib/mid.p)
,$x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 ,left($x,4).prtn
 ,mid($x,3,4).prtn
 ,right($x,4).prtn
 ;

実行例
D:\sample\lib>adp mid.p
ABCD
DEFG
WXYZ

now (時刻文字列の取得)

形式
 now( $add, $result)
引数
  • $add: 現在時刻からの加算(減算)秒(省略可)
  • $result: 結果(時刻の文字列)
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
時刻の文字列を取得します。$addを省略すると現在時刻の文字列を$resultに返します。
$addに整数値を指定すると$add秒だけ現在時刻から進めます(マイナス値だと戻します)。
now述語は、Cランタイムのctimeを呼び出しています。

コード例 (lib/now.p)
,now.prtn;
,now(86400).prtn;

実行例
Thu Apr 28 20:44:29 2011
Fri Apr 29 20:44:29 2011

regex_replace (正規表現による全置換)

形式
 regex_replace( $src, $find_regex, $replace, $offset, $dst)
引数
  • $src: 文字列
  • $find_regex: 正規表現による検索文字列
  • $replace: 置換文字列
  • $offset: 検索開始位置(省略可)
  • $dst: 結果
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された文字列から$find_regexで指定された文字列を検索し、$replaceで置き換え、結果を$dstで返します。
$offsetが指定された場合、$offsetで示された場所から検索(置換)を行います。
本述語は一致した全ての文字列を置換します。

※ADPは Boost.Regex 正規表現ライブラリを使用しています。
正規表現の構文は、Perl Reqular Expression Syntax のとおりです。

regex_replace_first (正規表現による置換)

形式
 regex_replace_first( $src, $find_regex, $replace, $offset, $dst)
引数
  • $src: 文字列
  • $find_regex: 正規表現による検索文字列
  • $replace: 置換文字列
  • $offset: 検索開始位置(省略可)
  • $dst: 結果
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された文字列から$find_regexで指定された文字列を検索し、$replaceで置き換え、結果を$dstで返します。
$offsetが指定された場合、$offsetで示された場所から検索(置換)を行います。
本述語は最初に一致した文字列のみ置換します。

※ADPは Boost.Regex 正規表現ライブラリを使用しています。
正規表現の構文は、Perl Reqular Expression Syntax のとおりです。

replace (文字列の全置換)

形式
 replace( $src, $find, $replace, $offset, $dst)
引数
  • $src: 文字列
  • $find: 検索文字列
  • $replace: 置換文字列
  • $offset: 検索開始位置(省略可)
  • $dst: 結果
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された文字列から$findで指定された文字列を検索し、$replaceで置き換え、結果を$dstで返します。
$offsetが指定された場合、$offsetで示された場所から検索(置換)を行います。
本述語は一致した全ての文字列を置換します。


replace_first (文字列の置換)

形式
 replace_first( $src, $find, $replace, $offset, $dst)
引数
  • $src: 文字列
  • $find: 検索文字列
  • $replace: 置換文字列
  • $offset: 検索開始位置(省略可)
  • $dst: 結果
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された文字列から$findで指定された文字列を検索し、$replaceで置き換え、結果を$dstで返します。
$offsetが指定された場合、$offsetで示された場所から検索(置換)を行います。
本述語は最初に一致した文字列を置換します。


right (右からの部分文字列の取得)

形式
 right( $src, $cnt, $dst)
引数
  • $src: 文字列
  • $cnt: バイト数
  • $dst: 結果
完了時の動作
  • 正常時:次の述語を実行に移ります。
  • 異常時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された文字列を最終バイトから$cntバイト取得し、$dstに格納します。
引数に無効な値を指定するとバックトラックします。

コード例 (lib/mid.p)
,$x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 ,left($x,4).prtn
 ,mid($x,3,4).prtn
 ,right($x,4).prtn
 ;

実行例
D:\sample\lib>adp mid.p
ABCD
DEFG
WXYZ

rkey

search

sha1 (SHA1ハッシュを返す)

形式
 sha1( $src, $dst)
引数
  • $src: 文字列
  • $dst: 結果
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された文字列からSHA1ハッシュ値を$dstに取得します。$dstは文字列で返されます。

コード例 (lib/sha1.p)
,file('sha1.p').sha1.prt;

実行例
D:\sample\lib>adp sha1.p
D62745C8425675EE054CFA89D982DC746CF4E062

split (文字列の分割)

形式
 split( $src, $key, @result)
引数
  • $src: 変換元
  • $key: 分割キー
  • @result: 結果
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された値を整数へ変換し$dstへ格納します。$srcは文字列と共に実数、整数自身も指定できます。

コード例 (lib/split.p)
,$x = "This is a pen", split($x, ' ').each.prtn,next;

実行例
D:\sample\lib>adp split.p
This
is
a
pen

sprintf (sprintf関数の呼び出し)

形式
 sprintf( $arg, ... , $fmt, $result)
引数
  • $arg: フォーマット文字列への引数(可変)
  • $fmt: フォーマット文字列
  • $result: 結果
完了時の動作
  • 正常時:次の述語を実行に移ります。
  • 異常時(フォーマットエラー):バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$fmtをフォーマット文字列とし、$argを引数としてC言語のsprintf関数を呼び出します。結果を$resultに格納します。

以下の書式指定文字をサポートしています(xとoはVer0.7からのサポートです)。
  • d: 整数(10進数で出力)
  • x: 整数(16進数で出力)
  • o: 整数( 8進数で出力)
  • f: 実数
  • s: 文字
  • ,: 3桁区切り整数(独自の拡張)

書式指定文字は、%sのように指定します。またC言語の書式指定文字列と同様に%40sや%5.2fなどのようにサイズも指定できます。
※Ver 0.82からはサイズ指定に * が使用できます。%*.*sのように指定できます。

コード例 (lib/sprintf.p)
,sprintf("文字列", 10, 3.14159265, 2560000, "%s::%03d / %5.2f / %,").prt;

※%s::%03dで、s::とコロンが2回出てきますが、Ver0.82以降のADPのsprintfの独自仕様で2つ必要になります。

実行例
D:\sample\lib>adp sprintf.p
文字列:010 /  3.14 / 2,560,000

※引数の順番がVer 0.82から変わりました。0.81以前では、以下のとおり$fmtが最初になります。
 sprintf( $fmt, $arg, ... , $result)


フォーマット文字列内での連想配列のキーアクセス
ADP 0.82以降では、sprintfに連想配列を渡した場合、フォーマット文字列に連想配列でのキーアクセスができるようになります。
書式指定文字の後に、例えば %s:key1; のように、
:キー名;
とコロンで続けてキー名を指定します(セミコロン;でキー名を終了させます)。

コード例 (lib/sprintf2.p)
_global({ :key1=>10, :key2=>'test', :key3=>10.5}, 'test');
global('test').sprintf("%d:key1; %s:key2; %f:key3;").prtn;

実行例
D:\sample\lib>adp sprintf2.p
10 test 10.500000


str (文字列への変換)

形式
 str( $src, $dst)
引数
  • $src: 変換元
  • $dst: 結果
完了時の動作
  • 常に次の述語を実行に移ります。バックトラックしません。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された値を文字列へ変換し$dstへ格納します。$srcには整数、実数と共に文字列自身も指定できます。
$srcがNILの場合、$dstにNILを格納します(*Ver0.81以降)。

コード例 (lib/str.p)
,str(10).prtn;
,str(10.2).prtn;

実行例
D:\sample\lib>adp str.p
10
10.200000

substr (部分文字列の取得)

形式
 substr( $src, $start, $cnt, $dst)
引数
  • $src: 文字列
  • $start: 取得開始位置(バイト)
  • $cnt: 取得バイト数(省略可)
  • $dst: 結果
完了時の動作
  • 正常時:次の述語を実行に移ります。
  • 異常時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで指定された文字列を$startバイトの位置から$cntバイト取得し、$dstに格納します。
$cntを省略すると最後まで取得します。
引数に無効な値を指定するとバックトラックします。

※ver0.82から追加になります。
※substrは、midのエリアスになります。

コード例 (lib/mid.p)
,$x = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
 ,left($x,4).prtn
 ,mid($x,3,4).prtn
 ,right($x,4).prtn
 ;

実行例
D:\sample\lib>adp mid.p
ABCD
DEFG
WXYZ

trim (文字列の空白の削除)

形式
 trim( $src, $dst)
引数
  • $src: 文字列
  • $dst: 結果
完了時の動作
  • 正常時:次の述語を実行に移ります。
  • 異常時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$srcで示された文字列の両端の空白(スペース、タブ、改行)を削除し$dstに格納します。
引数に無効な値(文字ではない)を指定するとバックトラックします。

コード例 (lib/trim.p)
,$x = "   ABC   ", trim($x).prtn;

実行例
D:\sample\lib>adp trim.p
ABC

urldecode (URLデコード)

形式
 urldecode( $src1,..., $dst)
引数
  • $src1: 文字列(複数可)
  • $dst: 結果
完了時の動作
  • 正常時:次の述語を実行に移ります。
  • 異常時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$src1で指定された文字列をURLデコードします。複数の文字列を指定した場合、単純に結果を結合します。
引数に文字列以外を指定するとバックトラックします。

※+(プラス)文字は 空白 に変換されます。

コード例(lib/urldecode.p)
,urldecode('%93%FA%96%7B%8C%EA%95%B6%8E%9A%97%F1%81iShift-JIS%81j').prtn;

実行例(Windows)
D:\sample\lib>adp urldecode.p
日本語文字列(Shift-JIS)

urlencode (URLエンコード)

形式
 urldecode( $src1,..., $dst)
引数
  • $src1: 文字列(複数可)
  • $dst: 結果
完了時の動作
  • 正常時:次の述語を実行に移ります。
  • 異常時:バックトラックします。
バックトラック時の動作
  • 常にバックトラックします。前の述語にバックトラックします。
説明
$src1で指定された文字列をURLエンコードします。複数の文字列を指定した場合、単純に結果を結合します。
引数に文字列以外を指定するとバックトラックします。

URLエンコードは、以下で指定された以外の文字を%(文字コード)に変換します。
・アルファベット
・- (マイナス)
・_ (アンダースコア)
・. (ピリオド)

コード例(lib/urlencode.p シフトJISで保存)
,urlencode('日本語文字列(Shift-JIS)').prtn;

実行例(Windows)
D:\sample\lib>adp urlencode.p
%93%FA%96%7B%8C%EA%95%B6%8E%9A%97%F1%81iShift-JIS%81j


Powered by ADP.