「Wcmatch」の版間の差分

提供:GizmoLabs - だいたい CAD LISP なサイト
(ページの作成: ; 構文 : (wcmatch ''string'' ''pattern'') ; 機能 : ワイルドカードを使用して、文字列のパターン マッチングを行う。 ; 引数 :* string : 比…)
 
編集の要約なし
 
(同じ利用者による、間の3版が非表示)
1行目: 1行目:
{{AutoLISP}}
; 構文
; 構文
: (wcmatch ''string'' ''pattern'')   
: (wcmatch ''string'' ''pattern'')   
5行目: 6行目:
; 機能
; 機能
: ワイルドカードを使用して、文字列のパターン マッチングを行う。
: ワイルドカードを使用して、文字列のパターン マッチングを行う。


; 引数
; 引数
11行目: 13行目:


: * どちらの引数にも、クォーテーションで囲まれた文字列、または文字列変数を使用できる。 これは、変数や AutoLISP 関数が返す値を string や pattern に使用する場合にも該当する。
: * どちらの引数にも、クォーテーションで囲まれた文字列、または文字列変数を使用できる。 これは、変数や AutoLISP 関数が返す値を string や pattern に使用する場合にも該当する。


; 戻り値
; 戻り値
29行目: 32行目:
| * (アスタリスク) || 空文字列を含む任意の文字シーケンスにマッチし、検索パターンの先頭、中間、末尾のどこにでも使用できる。
| * (アスタリスク) || 空文字列を含む任意の文字シーケンスにマッチし、検索パターンの先頭、中間、末尾のどこにでも使用できる。
|-
|-
| ? (クエスチョンマーク) || 任意の 1 文字にマッチする
| ? (クエスチョンマーク) || 任意の 1 文字にマッチする ex. *oof は LoofやRoof に対応。
|-
|-
|~ (ティルダ) || パターンの先頭の文字の場合、パターン以外の任意の文字にマッチする
|~ (ティルダ) || パターンの先頭の文字の場合、パターン以外の任意の文字にマッチする ex. ~*AB* は、AB を含まないすべての文字列に対応。
|-
|-
| [...] || 囲まれた文字のいずれか 1 文字にマッチする
| [...] || 囲まれた文字のいずれか 1 文字にマッチする ex.[AB]C は AC と BC に対応。
|-
|-
| [~...] || 囲まれた文字以外の 1 文字にマッチする
| [~...] || 囲まれた文字以外の 1 文字にマッチする ex.[~AB]C は XC には対応するが、AC には対応しない。
|-
|-
| - (ハイフン) || 角括弧内で使用され、文字の範囲を指定する
| [ - ] (ハイフン) || 角括弧内で使用され、文字の範囲を指定する ex. [A-G]C は、AC、BC など、GC までに対応し、HC には対応しない。
|-
|-
| , (カンマ) || 2 つのパターンを区切る
| , (カンマ) || 2 つのパターンを区切る ex. str1,str2
|-
|-
| ` (バッククオーテーション) || 特殊文字をエスケープする(次の文字を文字どおりに読む)
| ` (バッククオーテーション) || 特殊文字をエスケープする(次の文字を文字どおりに読む) ex. `~AB は ~AB という文字となる。
|}
|}




; サンプル
; サンプル
: 次のコマンドは、文字列が文字 N で始まるかどうかを調べている。
<pre class="brush:autolisp;">; 次のコマンドは、文字列が文字 N で始まるかどうかを調べている。
(wcmatch "Name" "N*")  
(wcmatch "Name" "N*")  
'''T'''
T
: 次の例は、3 つの比較を行う。 3 つのパターン条件のいずれかを満足すると、wcmatch 関数は T を返す。 テストは次の 3 つ。
</pre>
: 文字列が 3 文字で構成されている。
 
: 文字列に m が含まれない。
 
: 文字列が文字 " N" で始まる。
<pre class="brush:autolisp;">; 次の例は、3 つの比較を行う。 3 つのパターン条件のいずれかを満足すると、wcmatch 関数は T を返す。 テストは次の 3 つ。
: この 3 つの条件のいずれかを満足している場合、wcmatch 関数は T を返す。
; 文字列が 3 文字で構成されている。
(wcmatch "Name" "???,~*m*,N*")  
; 文字列に m が含まれない。
'''T'''
; 文字列が文字 " N" で始まる。
: 上記の例では、最後の条件を満足しているので、wcmatch 関数は T を返す。  
; この 3 つの条件のいずれかを満足している場合、wcmatch 関数は T を返す。
(wcmatch "Name" "???,~*m*,N*")  
T
; 上記の例では、最後の条件を満足しているので、wcmatch 関数は T を返す。
</pre>


: wcmatch 関数でエスケープ文字を使用する
: wcmatch 関数でエスケープ文字を使用する
: 文字列内のワイルドカード文字をテストするために、バッククォーテーション(`)を使用して文字をエスケープできる。 エスケープとは、バッククォーテーションの次の文字がワイルドカードとして読み込まれないということを意味し、文字どおりに比較される。 たとえば、文字列 "Name" 内にカンマが存在するかどうかを検索するには、次のように入力する。
: 文字列内のワイルドカード文字をテストするために、バッククォーテーション(`)を使用して文字をエスケープできる。 エスケープとは、バッククォーテーションの次の文字がワイルドカードとして読み込まれないということを意味し、文字どおりに比較される。
(wcmatch "Name" "*`,*")  
たとえば、文字列 "Name" 内にカンマが存在するかどうかを検索するには、次のように入力する。
'''nil'''
<pre class="brush:autolisp;">
(wcmatch "Name" "*`,*")  
nil
</pre>
 
: C や AutoLISP プログラミング言語では、円記号(¥)はエスケープ文字として使用されるので、文字列内で 1 つの円記号を作成するには 2 つの円記号(¥¥)が必要。 文字列 "Name" 内に円記号が存在するかどうかを調べるには、次のように関数を呼び出す。
: C や AutoLISP プログラミング言語では、円記号(¥)はエスケープ文字として使用されるので、文字列内で 1 つの円記号を作成するには 2 つの円記号(¥¥)が必要。 文字列 "Name" 内に円記号が存在するかどうかを調べるには、次のように関数を呼び出す。
  (wcmatch "Name" "*`¥¥*")  
  (wcmatch "Name" "*`¥¥*")  
  '''nil'''
  '''nil'''


: 括弧内のすべての文字([ . . . ])は文字どおりに読み取られるので、エスケープする必要はない。 ただし、例外もあり、ティルダ文字(~)は括弧で閉じられた文字の先頭にない場合(例 "[A~BC]")には文字どおりに読み取られ、先頭にある場合は否定文字として読み取られる。これは、ティルダの後の文字以外のすべての文字が条件を満足するということです(例 "[~ABC]")。 ハイフン(-)は括弧内の先頭および最後にある場合や(例 "[–ABC]" や "[ABC–]")、先頭のティルダの次にある場合(例 "[~‑ABC]")は文字どおりに読み取られる。 それ以外の場合、ハイフン(-)は文字の範囲を指定するために使用される。 範囲は 1 文字についてのみ有効なので、"STR[1-38]" は STR1、STR2、STR3、STR8 にマッチし、"[A-Z]" は 1 つの大文字のアルファベットにマッチする。
* 括弧内のすべての文字([ . . . ])は文字どおりに読み取られるので、エスケープする必要はない。 ただし、例外として先頭にあるティルダ文字(~)は否定文字として読み取られる。これは、ティルダの後の文字以外のすべての文字が条件を満足するということである(例 "[~ABC]" ABC 以外の文字、Z や 0、a などにマッチする)。
 
* ハイフン(-)は括弧内の先頭および最後にある場合や(例 "[–ABC]" や "[ABC–]")、先頭のティルダの次にある場合(例 "[~‑ABC]")は文字どおりに読み取られる。 それ以外の場合、ハイフン(-)は文字の範囲を指定するために使用される。
: 右角括弧(])も、それが角括弧で囲まれた最初の文字である場合、および先頭のティルダの次にある場合("[ ]ABC]" や "[~]ABC]")は、文字どおりに読み取られる。
* 範囲は 1 文字についてのみ有効なので、"STR[1-38]" は STR1、STR2、STR3、STR8 にマッチし、"[A-Z]" は 1 つの大文字のアルファベットにマッチする。
* 右角括弧(])も、それが角括弧で囲まれた最初の文字である場合、および先頭のティルダの次にある場合("[ ]ABC]" や "[~]ABC]")は、文字どおりに読み取られる。
* 日本語は対象になっていないので、ASCIIコードに分解したりする必要がある不親切仕様なので、ActiveX とか別の一般的な正規表現使ったほうがわかりやすいやもしれず。


: 将来の AutoLISP でワイルドカード文字が追加される可能性があるので、パターン内のすべての非英数字をエスケープして上位互換性を保証するとよい。
*'''注''' : 将来の AutoLISP でワイルドカード文字が追加される可能性があるので、パターン内のすべての非英数字をエスケープして上位互換性を保証するとよい。




[[Category:AutoLISP]]
[[Category:AutoLISP]]

2022年6月6日 (月) 06:00時点における最新版

構文
(wcmatch string pattern)


機能
ワイルドカードを使用して、文字列のパターン マッチングを行う。


引数
  • string : 比較する文字列。 比較では大文字と小文字が区別されるので、大文字と小文字が一致していなければならない。
  • pattern : string とマッチングするパターンを含んだ文字列。 pattern 引数には、次の 「ワイルドカード文字」の表にあるワイルドカード パターン マッチング文字を含めることができる。 パターン内でカンマを使用することにより、複数のパターン条件を入力することができる。 string と pattern の先頭の約 500 文字のみが比較され、それ以降は無視される。
* どちらの引数にも、クォーテーションで囲まれた文字列、または文字列変数を使用できる。 これは、変数や AutoLISP 関数が返す値を string や pattern に使用する場合にも該当する。


戻り値
string と pattern がマッチした場合、wcmatch 関数は T を返す。それ以外の場合は、nil を返す。


ワイルド カード文字
文字 定義
# (シャープ記号) 1 つの数字にマッチする
@ (アット記号) 1 つのアルファベット文字にマッチする
. (ピリオド) 1 つの非英数字にマッチする
* (アスタリスク) 空文字列を含む任意の文字シーケンスにマッチし、検索パターンの先頭、中間、末尾のどこにでも使用できる。
? (クエスチョンマーク) 任意の 1 文字にマッチする ex. *oof は LoofやRoof に対応。
~ (ティルダ) パターンの先頭の文字の場合、パターン以外の任意の文字にマッチする ex. ~*AB* は、AB を含まないすべての文字列に対応。
[...] 囲まれた文字のいずれか 1 文字にマッチする ex.[AB]C は AC と BC に対応。
[~...] 囲まれた文字以外の 1 文字にマッチする ex.[~AB]C は XC には対応するが、AC には対応しない。
[ - ] (ハイフン) 角括弧内で使用され、文字の範囲を指定する ex. [A-G]C は、AC、BC など、GC までに対応し、HC には対応しない。
, (カンマ) 2 つのパターンを区切る ex. str1,str2
` (バッククオーテーション) 特殊文字をエスケープする(次の文字を文字どおりに読む) ex. `~AB は ~AB という文字となる。


サンプル
; 次のコマンドは、文字列が文字 N で始まるかどうかを調べている。
(wcmatch "Name" "N*") 
T


; 次の例は、3 つの比較を行う。 3 つのパターン条件のいずれかを満足すると、wcmatch 関数は T を返す。 テストは次の 3 つ。
; 文字列が 3 文字で構成されている。
; 文字列に m が含まれない。
; 文字列が文字 " N" で始まる。
; この 3 つの条件のいずれかを満足している場合、wcmatch 関数は T を返す。
(wcmatch "Name" "???,~*m*,N*") 
T
; 上記の例では、最後の条件を満足しているので、wcmatch 関数は T を返す。
wcmatch 関数でエスケープ文字を使用する
文字列内のワイルドカード文字をテストするために、バッククォーテーション(`)を使用して文字をエスケープできる。 エスケープとは、バッククォーテーションの次の文字がワイルドカードとして読み込まれないということを意味し、文字どおりに比較される。

たとえば、文字列 "Name" 内にカンマが存在するかどうかを検索するには、次のように入力する。

(wcmatch "Name" "*`,*") 
nil
C や AutoLISP プログラミング言語では、円記号(¥)はエスケープ文字として使用されるので、文字列内で 1 つの円記号を作成するには 2 つの円記号(¥¥)が必要。 文字列 "Name" 内に円記号が存在するかどうかを調べるには、次のように関数を呼び出す。
(wcmatch "Name" "*`¥¥*") 
nil
  • 括弧内のすべての文字([ . . . ])は文字どおりに読み取られるので、エスケープする必要はない。 ただし、例外として先頭にあるティルダ文字(~)は否定文字として読み取られる。これは、ティルダの後の文字以外のすべての文字が条件を満足するということである(例 "[~ABC]" は ABC 以外の文字、Z や 0、a などにマッチする)。
  • ハイフン(-)は括弧内の先頭および最後にある場合や(例 "[–ABC]" や "[ABC–]")、先頭のティルダの次にある場合(例 "[~‑ABC]")は文字どおりに読み取られる。 それ以外の場合、ハイフン(-)は文字の範囲を指定するために使用される。
  • 範囲は 1 文字についてのみ有効なので、"STR[1-38]" は STR1、STR2、STR3、STR8 にマッチし、"[A-Z]" は 1 つの大文字のアルファベットにマッチする。
  • 右角括弧(])も、それが角括弧で囲まれた最初の文字である場合、および先頭のティルダの次にある場合("[ ]ABC]" や "[~]ABC]")は、文字どおりに読み取られる。
  • 日本語は対象になっていないので、ASCIIコードに分解したりする必要がある不親切仕様なので、ActiveX とか別の一般的な正規表現使ったほうがわかりやすいやもしれず。
  •  : 将来の AutoLISP でワイルドカード文字が追加される可能性があるので、パターン内のすべての非英数字をエスケープして上位互換性を保証するとよい。