⽂字列

整形

ACETUTIL関数
(acet-str-format format [arg ...])
format:文字列
arg:文字列、整数、または実数
定型の文字列に、後続の引数の値を埋め込んだ文字列を返します。
戻り値:文字列

acet-str-format 関数は、定型の文字列に、後続の引数の値を埋め込んだ文字列を返します。

定型の文字列にどのように埋め込むかは「%1」「%2」といった具合に「%」の後に整数をつけて、場所と後続の引数の順を指定します。

埋め込む引数は、文字列以外に、整数や実数を使用できます。実数の文字列への変換は、システム変数 LUNITS や LUPREC によります。

_$ (acet-str-format "name : %1 , age : %2 , height : %3" "Donald" 70 190.53) ⏎
"name : Donald , age : 70 , height : 190.5"

トリム

AutoLISP関数
(vl-string-left-trim char-set string)
char-set:文字列
string:文字列
指定された文字を、文字列の先頭から削除します。
戻り値:文字列
AutoLISP関数
(vl-string-right-trim char-set string)
char-set:文字列
string:文字列
指定された文字を、文字列の末尾から削除します。
戻り値:文字列
AutoLISP関数
(vl-string-trim char-set string)
char-set:文字列
string:文字列
指定された文字を、文字列の先頭と末尾から削除します。
戻り値:文字列

char-set 引数には除去したい文字を並べた文字列です。

vl-string-left-trim 関数は、文字列の先頭(左)から char-set に指定した文字を削除します。

vl-string-right-trim 関数は、文字列の末尾(右)から char-set に指定した文字を削除します。

vl-string-trim 関数は、文字列の先頭と末尾から char-set に指定した文字を削除します。

_$ (vl-string-left-trim " ¥t¥n[]" "¥n ¥t[A rose is red.] ¥n") ⏎
"A rose is red.] ¥n"
_$ (vl-string-right-trim " ¥t¥n[]" "¥n ¥t[A rose is red.] ¥n") ⏎
"¥n ¥t[A rose is red."
_$ (vl-string-trim " ¥t¥n[]" "¥n ¥t[A rose is red.] ¥n") ⏎
"A rose is red."

比較

ACETUTIL関数
(acet-str-equal str1 str2 [matchCase])
str1,str2:文字列
matchCase:nil、または nil 以外
二つの文字列を比較します。
戻り値:nil、または nil 以外

acet-str-equal 関数は、二つの文字列を比較します。通常は大文字小文字を区別しません。

matchCase 引数を nil 以外に指定すると、大文字小文字を区別した比較を行います。

_$ (acet-str-equal "Layer-01" "LAYER-01") ⏎
T
_$ (acet-str-equal "Layer-01" "LAYER-01" T) ⏎ nil
ACETUTIL関数
(acet-str-collate str1 str2 [matchCase])
str1,str2:文字列
matchCase:nil、または nil 以外
二つの文字列を比較して、その大小を返します。
戻り値:整数(-1,0,1)

acet-str-collate 関数は、二つの文字列を比較して、その大小を返します。戻り値は、ソートなどの用途に使用できます。通常は、大文字小文字を同一視します。

matchCase 引数を nil 以外に指定すると、大文字小文字を区別した比較を行います。

戻り値は、-1 0 1 といった三つの整数です。次のような意味を表します。

戻り値 説明
-1 str1 < str2
0 sre1と str2 は等しい
1 str1 > str1
_$ (acet-str-collate "apple" "banana") ⏎
-1
_$ (acet-str-collate "banana" "Banana") ⏎
0
_$ (acet-str-collate "orange" "banana") ⏎
1

acet-str-collate 関数を文字列のリストで使用した例は以下の通りです。

_$ (vl-sort '("apple" "pineapple" "orenge" "berry") '(lambda (i1 i2) (not (< 0 (acet-str-collate i1 i2))))) ⏎
("apple" "berry" "orenge" "pineapple")

なお、上の例は acad_strlsort 関数を使えば次のように簡単に書けます。標準で大文字小文字を区別しないのも同様です。

_$ (acad_strlsort '("apple" "pineapple" "orenge" "berry")) ⏎
("apple" "berry" "orenge" "pineapple")

共通部分

AutoLISP関数
(vl-string-mismatch str1 str2 [pos1 pos2 ignore-case])
str1,str2:文字列
pos1,pos2:整数
ignore-case:nil、または nil 以外
指定された位置から始まる、2 つの文字列の最も長い共通部分の長さを返します。
戻り値:整数、またはnil

vl-string-mismatch 関数は、二つの文字列の共通するフレーズの長さを返します。pos1,2 を指定しなければ先頭から比較して一致する文字の長さを返します。

_$ (vl-string-mismatch "vl-string-mismatch" "vl-string-position") ⏎
10

pos1,2 はそれぞれの文字列を比較する先頭位置を指定します。ignore-case を nil 以外にすると、大文字小文字を区別しません。

日本語の文字は扱えますが、正式には対応していませんので、誤った値が返ることがあります。長さは 2 バイト文字として 2 倍の値が返ります。

_$ (vl-string-mismatch "選択した図形は" "選択図形は") ⏎
4
_$ (vl-string-mismatch "選択した図形は" "選択する図形は") ⏎
5

マッチング

AutoLISP関数
(wcmatch string pattern)
string:文字列
pattern: 文字列
ワイルドカードを使用して、文字列のパターンマッチングを行います。
戻り値:nil、または nil 以外
ACETUTIL関数
(acet-str-wcmatch string pattern [matchCase])
string:文字列
pattern:文字列
matchCase:nil、または nil 以外
ワイルドカードを使用して、文字列のパターンマッチングを行います。
戻り値:nil、または nil 以外

wcmatch 関数は、string 文字列が pattern にマッチするかを返します。マッチすれば nil 以外を返します。pattern にはワイルドカードを使用することができます。大文字小文字は区別されます。

acet-str-wcmatch 関数は、wcmatch 関数と同様に動作しますが、通常は大文字小文字を区別しません。matchCase 引数を nil 以外に指定すると、wcmatch 関数と同じく大文字小文字を区別します。

これらは、文字列からパターンに一致する部分文字列を検索する関数ではなく、検査する文字列がパターンに完全一致するかどうかを調べます。ワイルドカードを使用しなければ、通常の文字列の比較と同じです。

_$ (wcmatch "abc" "abc")⏎
T
_$ (acet-str-wcmatch "abc" "ABC")⏎
T

ワイルドカードは以下のものが使用できます。正規表現のような雰囲気があります。

ワイルドカード文字 説明
# (シャープ記号) 1 つの数字にマッチします
@ (アット記号) 1 つのアルファベッド文字にマッチします
. (ピリオド) 1 つの英数字以外の記号文字にマッチします
* (アスタリスク) 空文字列を含む任意の文字シーケンスにマッチし、検索パターンの先頭、中間、末尾のどこにでも使用できます。
? (クエスチョン マーク) 任意の 1 文字にマッチします
~ (ティルダ) パターンの先頭に付けた場合、以降のパターン以外の任意の文字にマッチします
[...] 囲まれた文字のいずれか 1 文字にマッチします
[~...] 囲まれた文字以外の 1 文字にマッチします
- (ハイフン) 角括弧内で使用され、文字の範囲を指定します
, (カンマ) 2 つのパターンを区切ります
` (逆クォーテーション) ワイルドカード文字をエスケープします(後続の文字を文字どおりに扱います)

各ワイルドカードの簡単な例は以下のとおりです。

# (シャープ記号)
"###-####" 郵便番号のフォーマットに合う数字の文字列
_$ (wcmatch "001-2345" "###-####")
T
@ (アット記号)
"@@78" 最初の2文字がアルファベットで、78が続く文字列
_$ (wcmatch "RX78" "@@78")
T
. (ピリオド)
"####.####.####" 四文字ごとに記号文字で区切られた12桁の数字の文字列
_$ (wcmatch "1234+5678-9012" "####.####.####")
T
* (アスタリスク)
"AutoCAD*" AutoCADで始まる文字列
_$ (wcmatch "AutoCAD LT" "AutoCAD*")
T
? (クエスチョン マーク)
"??????" 6文字の任意の文字列
_$ (wcmatch "ABCD12" "??????")
T
~ (ティルダ)
"~photoshop" "photoshop"以外の文字
_$ (wcmatch "AutoCAD" "~photoshop")
T
[...]
"AutoCAD 202[12345]" "AutoCAD 2021"から"AutoCAD 2025"を表す文字列
_$ (wcmatch "AutoCAD 2022" "AutoCAD 202[12345]")
T
[~...]
"AutoCAD 202[~12345]" "AutoCAD 202"で始まり、最後の一文字が1から5ではない文字列
_$ (wcmatch "AutoCAD 202x" "AutoCAD 202[~12345]")
T
- (ハイフン)
"AutoCAD 202[1-5]" "AutoCAD 2021"から"AutoCAD 2025"を表す文字列
_$ (wcmatch "AutoCAD 2022" "AutoCAD 202[1-5]")
T
, (カンマ)
"AutoCAD,AutoCAD LT" "AutoCAD"か"AutoCAD LT"である文字列
_$ (wcmatch "AutoCAD LT" "AutoCAD,AutoCAD LT")
T
` (逆クォーテーション)
"`~`#`@`.`*`?" ワイルドカードで使われる特殊文字をエスケープした、“~#@.*?”という文字列
_$ (wcmatch "~#@.*?" "`~`#`@`.`*`?")
T

次の例は、文字列のリストから、パターンにマッチするものだけを抽出しています。

_$ (vl-remove-if-not '(lambda (layer) (wcmatch layer "LAYER-A##")) '("LAYER-A05" "LAYER-A08" "LAYER-B01"))
("LAYER-A05" "LAYER-A08")

ACETUTIL で使用できる正規表現

ACETUTIL の acet-str-find 関数と acet-str-replace 関数では、検索する部分文字列に正規表現が使用できました。これは wcmatch 関数や acet-str-wcmatch 関数でワールドカードと呼ばれているものに似ていますが異なり、より一般の正規表現に近いものです。

使用できる特殊文字は、WEB を検索すると次のようなものが使えるようです。

特殊文字
. (ピリオド)
* (アスタリスク)
+ (プラス)
^ (カレット)
$ (ドルマーク)
[...]
[^...]
- (ハイフン)
¥(...¥)
¥

しかしながら、試してみたところ思い通りのマッチングがおこらない場合があり、AutoCADの動作も不安定となりました。使用する場合は、注意してください。

AutoLISP での正規表現

AutoLISP で正規表現を利用するには、他に ActiveX のアプリケーションオブジェクトを介して、外部アプリケーションのサブルーチンを利用する方法もあるようです。具体的には VBScript.RegExp を利用します。詳細は、WEBを検索してみてください。