文字列の等価性、大文字と小文字を無視しますか?


8

Q:文字列の等価性をどのようにテストしますが、大文字と小文字を無視しますか?

文字列を比較したいが大文字小文字を無視したい状況があります。大文字と小文字はにとって重要でstring-equalあり、明らかに以下の影響を受けませんcase-fold-search

(string-equal "string" "StrinG")        ; => nil
(let ((case-fold-search t))
  (string-equal "string" "StrinG"))     ; => nil

文字列をdowncase比較する前に、いつでも(たとえば、)文字列を前処理できます。

(string-equal (downcase "string")
              (downcase "StrinG"))      ; => t

しかし、それは毎回2つの追加の関数呼び出しを行うにはやり過ぎのようです。関連する述語関数を見落としたことがありますか?


比較文字列を使用したところ、次の問題が見つかりました。(setq str "title")(cond(compare-strings str "authortitle")は何かを実行します。)(compare-strings str "title")は他の処理を実行します。)最初のcompare-stringsは正の値を返します。私が欲しいもの。したがって、私は小文字の提案を使用しました。

回答:


7

使用できますcompare-strings

(compare-strings STR1 START1 END1 STR2 START2 END2 &optional IGNORE-CASE)

使用して、nil全体の文字列を使用するには、開始と終了のためです。


ありがとう。私はそれを見ましたがnil、あなたが言ったようにsを使うことができることを知りませんでした。nil関数呼び出しで4つの追加のを必要としない別のオプションがある場合に備えて、質問をもう少し長く開いておきます。
ダン

5

使用string-suffix-p

(string-suffix-p "string" "strinG" t)

はるかに単純で、4 nil秒は必要ありません。文字列自体が等しいかどうかはテストしません((string-suffix-p "word" "buzzword" t) ⇒ t)。ただし、これで十分な場合もあります(チェックする辞書が限られている場合)。


2
(string-suffix-p "strinG" "this string" t)も返しますt。これはOPが望むものではありません。この回答を変更または削除することをお勧めします。
トビアス

回答を更新しました。ので、私はそれを残してstring-{prefix,suffix}-p試験点におけるワードが(場合によっては混合することができる。例えばSQLで)キーボードを指定された場合等:多くの点で有用CAN
rgtk

3

別の短い代替:

(equalp "string" "strinG")      ; => t
(equalp "strinG" "this string") ; => nil 
(equalp "word" "buzzword")      ; => nil

equalpの略ですcl-equalp。から(documentation 'equalp)

「等しい」に似ていますが、数値的に等しい数の異なる型(floatとinteger)を受け入れ、大文字と小文字を区別せずに文字列を比較します 。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.