文字列の比較はTera Termマクロを書く上で基本的な機能のひとつです。
ある文字列同士が同じなのか?異なるのか、ある文字列が一定のパターンに一致するのか?しないのか、ある文字列に特定の文字列が含まれるのか?含まれないのか、そういった事を実現する機能をTera Termマクロは提供しています。
文字列を比較するために用意されているTTLコマンドは3つ。「strcompare」「strmatch」「strscan」です。それぞれ用途が異なるコマンドですので、コマンドごとの特徴と使い方について解説していきます。
strcompare
strcompareは2つの文字列を符号なし整数のバイト列とみなして比較します。文字列を大小関係で比較するため、文字列が同一であるか確認するために使います。
比較の方法
strcompare 文字列1 文字列2
strcompareを実行すると結果がシステム変数 result に入ります。
- 文字列1の方が大きい … 1
- 文字列1と文字列2が一致 … 0
- 文字列1の方が小さい … -1
; 検索対象の文字列 string1 = 'abcdefg' ; result = 1 strcompare string1 'abc' ; result = -1 strcompare string1 'xyz' ; result = 0 strcompare string1 'abcdefg'
strmatch
strmatchはある文字列を正規表現によるパターンマッチに一致するかどうか調べます。
比較の方法
strmatch 検索対象の文字列 検索文字列(正規表現)
strmatchを実行すると結果がシステム変数 result に入ります。
- マッチしなかった … 0
- マッチした … マッチした位置
システム変数 matchstr には最初にマッチしたパターンが格納されます。
グループマッチした場合は、システム変数 groupmatchstr1〜groupmatchstr9にグループマッチしたパターンが格納されます。
パターンマッチ例 ①部分一致
; 検索対象の文字列 string = 'abcdefg' ; result = 3 ; matchstr = 'cde' strmatch string 'cde'
検索文字列 cde は先頭から3オクテット目のため、システム変数 result にはマッチした場所として3が格納されます。またシステム変数 matchstr には検索パターンの cde が格納されます。
パターンマッチ例 ②完全一致
; 検索対象の文字列 string = 'abcdefg' ; result = 1 ; matchstr = 'abcdefg' strmatch string 'abcedef'
完全一致している場合は、先頭が一致したのでシステム変数 result には1が格納され、システム変数 matchstr には検索パターンの abcdefg が格納されます。
パターンマッチ例 ③正規表現
; 検索対象の文字列 string = 'abcdefg' ; result = 1 ; matchstr = 'abcdefg' strmatch string '^a[a-z]+g$'
正規表現も使えます。システム変数 result には先頭から一致したので 1 が格納され、システム変数 matchstr には検索パターンの abcdefg が格納されます。
パターンマッチ例 ④グループマッチ
; 検索対象の文字列 string = '192.168.2.1' ; result = 1 ; matchstr = 192.168.2.1 ; groupmatchstr1 = 192 ; groupmatchstr2 = 168 ; groupmatchstr3 = 2 ; groupmatchstr4 = 1 strmatch string '^([0-9]+).([0-9]+).([0-9]+).([0-9]+)$''
正規表現を()でグループ化した場合は、システム変数 groupmatchstr1〜groupmatchstr9 にマッチしたパターンが格納されます。
システム変数 result には先頭から一致したので 1 が格納され、システム変数 matchstr には検索パターンの 192.168.2.1 が格納されます。
strscan
strscanはある文字列に特定の文字列が含まれているのか調べます。正規表現は使えません。
比較の方法
strscan 文字列 部分文字列
文字列の中に部分文字列が含まれているのか調べます。部分文字列が含まれていると、システム変数resultにその位置が格納されます。含まれていない場合はシステム変数resultに0が格納されます。
str = 'abcdefg' substr = 'c' ; result = 3 strscan str substr
次のように文字列に部分文字列が含まれない場合はシステム変数resultに0が格納されます。
str = 'abcdefg' substr = 'x' ; result = 0 strscan str substr
使い分け
まとめると、文字列同士が同一なのか調べたいときはstrcompareを使います。文字列があるパターンに一致するのか調べたい、グループマッチにより特定の範囲を切り出したいときはstrmatchを使います。特定の文字や文字列が含まれるのか、どの位置にマッチするのか調べたいときはstrscanを使います。
日本語を検索する場合の注意点
日本語を検索する場合、文字コードを適切に設定しなければ検索ができません。日本語を扱う場合は regexoption コマンドで設定をおこなう必要があります。regexoptionについては以下の記事を参考にしてください。