GNU Emacs 32.0.50 (9008bf64c3) のマニュアルを PLaMo 翻訳で機械翻訳したものです。誤訳を含むことがあります。原文: https://www.gnu.org/software/emacs/manual/html_node/elisp/Text-Comparison.html ・ emacs-doc.conao3.com

4.5 文字と文字列の比較

関数: char-equal character1 character2

この関数は、引数が同一の文字を表す場合は t を、そうでない場合は nil を返します。case-fold-search が nil でない場合、この関数は大文字・小文字の区別を無視します。

(char-equal ?x ?x)
     ⇒ t
(let ((case-fold-search nil))
  (char-equal ?x ?X))
     ⇒ nil
関数: string-equal string1 string2

この関数は、2つの文字列の文字が完全に一致する場合に t を返します。引数としてシンボルを指定することもでき、その場合はシンボル名が使用されます。case-fold-search に関わらず、常に大文字と小文字が区別されます。

この関数は、2つの文字列を比較する場合に equal と同等です(等価述語 を参照)。特に、2つの文字列のテキストプロパティは無視されます。テキストプロパティのみが異なる文字列を区別する必要がある場合は、equal-including-properties を使用してください。ただし、equal とは異なり、いずれかの引数が文字列またはシンボルでない場合、string-equal はエラーを報告します。

(string-equal "abc" "abc")
     ⇒ t
(string-equal "abc" "ABC")
     ⇒ nil
(string-equal "ab" "ABC")
     ⇒ nil

ユニバイト文字列とマルチバイト文字列が string-equal の意味で等しいのは、両者がいずれも 0–127 (ASCII) の範囲にある同一の文字コード列を含んでいる場合に限られる。テキスト表現を参照。

関数: string= string1 string2

string=はstring-equalの別名です。

関数: string-equal-ignore-case string1 string2

string-equal-ignore-case は、case-fold-search が t の場合の char-equal のように、大文字小文字を区別せずに文字列を比較します。

関数: string-collate-equalp string1 string2 &optional locale ignore-case

この関数は、string1 と string2 が、指定された locale(デフォルトは現在のシステムロケール)の照合規則に従って等しい場合に t を返します。照合規則は、string1 と string2 に含まれる文字の辞書順だけでなく、これらの文字間の関係に関するさらなる規則によっても決定されます。通常、これは Emacs が動作しているロケール環境と、Emacs がリンクされた標準 C ライブラリによって定義されます4。

例えば、異なるグレイヴ・アクセントのUnicode文字のように、コードポイントは異なるが意味が同じ文字は、一部のロケールでは等しいとみなされる場合があります:

(string-collate-equalp (string ?\uFF40) (string ?\u1FEF))
     ⇒ t

オプション引数 locale(文字列)は、照合用の現在のロケール識別子の設定を上書きします。この値はシステムに依存しており、POSIXシステムでは locale や "en_US.UTF-8" が適用され、例えば MS-Windows システムでは "enu_USA.1252" となります。

ignore-case が nil でない場合、文字は小文字に変換され、大文字小文字を区別せずに比較されます。ただし、基盤となるシステムライブラリがロケール固有の照合規則を提供していない場合、この関数は string-equal にフォールバックし、その場合 ignore-case 引数は無視され、比較は常に大文字小文字を区別して行われます。

MS-WindowsシステムでUnicode準拠の照合をエミュレートするには、ロケールのコードセット部分がMS-Windowsでは"UTF-8"になり得ないため、w32-collate-ignore-punctuationをnil以外の値にバインドしてください。

システムがロケール環境をサポートしていない場合、この関数は string-equal と同様に動作します。

ファイルシステムは一般的に、照合処理で実装されている文字列の言語的な等価性を考慮しないため、この関数をファイル名の等価性判定に使用しないでください。

関数: string-lessp string1 string2

この関数は、2つの文字列を1文字ずつ比較します。両方の文字列を同時に走査し、最初に一致しない対応する文字のペアを探します。これら2つの文字のうち小さい方が string1 の文字である場合、string1 の方が小さく、この関数は t を返します。小さい方が string2 の文字である場合、string1 の方が大きく、この関数は nil を返します。2つの文字列が完全に一致する場合、値は nil となります。

文字のペアは、それぞれの文字コードに基づいて比較されます。ASCII 文字セットでは、小文字は対応する大文字よりも数値が大きくなる点に注意してください。また、数字や多くの句読点文字は、大文字よりも数値が小さくなります。ASCII 文字は、いかなる非ASCII 文字よりも小さい値となります。ただし、ユニバイト文字列とマルチバイト文字列に共通しているのはASCII 文字セットのみであるため、通常、これら2種類の文字列間で他の文字を比較することに意味はありません(テキスト表現を参照)。

(string-lessp "abc" "abd")
     ⇒ t
(string-lessp "abd" "abc")
     ⇒ nil
(string-lessp "123" "abc")
     ⇒ t

文字列の長さが異なり、string1の長さまで一致した場合、結果はtとなります。string2の長さまで一致した場合、結果はnilとなります。文字を含まない文字列は、他のどの文字列よりも短くなります。

(string-lessp "" "abc")
     ⇒ t
(string-lessp "ab" "abc")
     ⇒ t
(string-lessp "abc" "")
     ⇒ nil
(string-lessp "abc" "ab")
     ⇒ nil
(string-lessp "" "")
     ⇒ nil

引数としてシンボルも指定可能で、その場合はプリント名が比較されます。

関数: string< string1 string2

string<はstring-lesspの別名です。

関数: string-greaterp string1 string2

この関数は、string1 と string2 を逆の順序で比較した結果を返します。つまり、(string-lessp string2 string1) を呼び出すのと同等です。

関数: string> string1 string2

string>はstring-greaterpの別名です。

関数: string-collate-lessp string1 string2 &optional locale ignore-case

この関数は、指定された locale(デフォルトは現在のシステムロケール)の照合順序において string1 が string2 より小さい場合に t を返します。照合順序は、string1 および string2 に含まれる文字の辞書順だけでなく、これらの文字間の関係に関するさらなる規則によっても決定されます。通常、これは Emacs が動作しているロケール環境と、Emacs がリンクされた標準 C ライブラリによって定義されます。

例えば、ソートの際には句読点や空白文字が無視される場合があります(シーケンスを参照):

(sort '("11" "12" "1 1" "1 2" "1.1" "1.2")
       :lessp #'string-collate-lessp)
     ⇒ ("11" "1 1" "1.1" "12" "1 2" "1.2")

この挙動はシステムに依存します。例えば、Cygwinではロケールに関わらず、句読点や空白文字が無視されることはありません。

オプション引数 locale(文字列)は、照合用の現在のロケール識別子の設定を上書きします。この値はシステムに依存し、POSIXシステムでは locale や "en_US.UTF-8" が適用されますが、例えば MS-Windows システムでは "enu_USA.1252" となります。locale に "POSIX" または "C" を指定すると、string-collate-lessp は string-lessp と同様に動作します:

(sort '("11" "12" "1 1" "1 2" "1.1" "1.2")
      :lessp (lambda (s1 s2) (string-collate-lessp s1 s2 "POSIX")))
     ⇒ ("1 1" "1 2" "1.1" "1.2" "11" "12")

ignore-case が nil でない場合、文字は小文字に変換され、大文字小文字を区別せずに比較されます。ただし、基盤となるシステムライブラリがロケール固有の照合規則を提供していない場合、この関数は string-lessp にフォールバックし、その場合 ignore-case 引数は無視され、比較は常に大文字小文字を区別して行われます。

MS-WindowsシステムでUnicode準拠の照合をエミュレートするには、ロケールのコードセット部分がMS-Windowsでは"UTF-8"になり得ないため、w32-collate-ignore-punctuationをnil以外の値にバインドしてください。

システムがロケール環境をサポートしていない場合、この関数は string-lessp と同様に動作します。

関数: string-version-lessp string1 string2

この関数は文字列を辞書順に比較しますが、数値文字の並びについては10進数であるかのように扱い、それらの数値を比較します。したがって、たとえ ‘12’ が辞書順で ‘2’ よりも “小さい” としても、この述語によれば ‘foo2.png’ は ‘foo12.png’ よりも “小さい” ことになります。

関数: string-prefix-p string1 string2 &optional ignore-case

この関数は、string1 が string2 の接頭辞である場合(すなわち string2 が string1 で始まる場合)、non-nil を返します。オプション引数 ignore-case が non-nil である場合、比較では大文字小文字の区別は無視されます。

関数: string-suffix-p suffix string &optional ignore-case

この関数は、suffix が string の接尾辞である場合(すなわち、string が suffix で終わる場合)、non-nil を返します。オプション引数 ignore-case が non-nil である場合、比較では大文字小文字の区別は無視されます。

関数: string-search needle haystack &optional start-pos

ともに文字列である haystack 内で、最初に出現する needle の位置を返します。start-pos が nil でない場合は、haystack のその位置から検索を開始します。一致するものが見つからなかった場合は nil を返します。この関数は比較を行う際、文字列内の文字のみを考慮し、テキストプロパティは無視します。マッチングは常に大文字小文字を区別します。

関数: compare-strings string1 start1 end1 string2 start2 end2 &optional ignore-case

この関数は、string1 の指定した部分と string2 の指定した部分を比較します。string1 の指定した部分は、インデックス start1(含む)からインデックス end1(除く)までです。start1 における nil は文字列の先頭を、end1 における nil は文字列の長さを表します。同様に、string2 の指定した部分は、インデックス start2 からインデックス end2 までです。

The strings are compared by the numeric values of their characters. For instance, str1 is considered less than str2 if its first differing character has a smaller numeric value. If ignore-case is non-nil, characters are converted to upper-case, using the current buffer’s case-table (see The Case Table), before comparing them. Unibyte strings are converted to multibyte for comparison (see Text Representations), so that a unibyte string and its conversion to multibyte are always regarded as equal.

2つの文字列の指定された部分が一致する場合、値は t となります。そうでない場合、値は、先頭の何文字が一致し、どちらの文字列がより小さいかを示す整数となります。その絶対値は、2つの文字列の先頭で一致する文字数に1を加えたものです。string1(またはその指定された部分)の方が小さい場合、符号は負となります。

関数: string-distance string1 string2 &optional bytecompare

この関数は、ソース文字列 string1 とターゲット文字列 string2 の間のレーベンシュタイン距離を返します。レーベンシュタイン距離とは、ソース文字列をターゲット文字列に変換するために必要な1文字単位の変更(削除、挿入、または置換)の数であり、文字列間の編集距離の定義の一つです。

文字列の大文字・小文字は計算される距離に影響しますが、テキストプロパティは無視されます。オプション引数 bytecompare が nil 以外の場合、この関数は文字単位ではなくバイト単位で距離を計算します。バイト単位の比較には文字の Emacs 内部表現が使用されるため、生バイトを含むマルチバイト文字列では不正確な結果となります(テキスト表現を参照)。生バイトを含む正確な結果が必要な場合は、エンコードして文字列をユニバイト形式にしてください(明示的なエンコードとデコードを参照)。

関数: assoc-string key alist &optional case-fold

この関数は assoc と同様に動作しますが、key は文字列またはシンボルである必要があり、比較には compare-strings が使用されます。シンボルは判定前に文字列に変換されます。case-fold が nil 以外の場合、key および alist の要素は比較前に大文字に変換されます。assoc とは異なり、この関数ではアリストの要素として、コンスではなく文字列やシンボルを指定することも可能です。特に、alist は実際のアリストではなく、文字列やシンボルのリストを指定できます。アソシエーションリスト を参照してください。

バッファ内のテキストを比較する方法については、テキストの比較にある関数 compare-buffer-substrings も参照してください。文字列に対して正規表現を照合する関数 string-match は、ある種の文字列比較に利用できます。詳細は 正規表現による検索 を参照してください。


脚注

(4)

照合規則とそのロケール依存性の詳細については、Unicode照合アルゴリズムを参照してください。GNU Cライブラリ(別名 glibc)などの一部の標準Cライブラリは、Unicode照合アルゴリズムの大部分を実装しており、関連するロケールデータであるCommon Locale Data Repository(CLDR)を利用しています。