Swift言語で大文字と小文字を区別しない2つの文字列を比較する方法は?


95

大文字と小文字を区別せずに2つの文字列を比較するにはどうすればよいですか?例:

var a = "Cash"
var b = "cash"

var aとvar bを比較した場合にtrueを返すメソッドはありますか


1
比較を行う前に、両方を小文字に変換できます。
Dino Tw

8
lowercaseString一部の回答で言及されているように、一部の言語では失敗することに注意してください(たとえば、Straße!= STRASSE)
Alladinian

@Alladinianあなたはそれをそれを行うことをどのように提案しますか?この問題を解決するためのほとんどの例は、すべて大文字またはすべて小文字に変換することを示していますか?
スティーブ

5
caseInsensitiveCompare:localizedCaseInsensitiveCompare:
@Steve

3
@Steve Sure!(試すことができます"Straße".localizedCaseInsensitiveCompare("STRASSE")-インポートを忘れないでくださいFoundation
Alladinian

回答:


13

これを試して:

var a = "Cash"
var b = "cash"
let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch, range: nil, locale: nil)

// You can also ignore last two parameters(thanks 0x7fffffff)
//let result: NSComparisonResult = a.compare(b, options: NSStringCompareOptions.CaseInsensitiveSearch)

結果はNSComparisonResult列挙型です:

enum NSComparisonResult : Int {

    case OrderedAscending
    case OrderedSame
    case OrderedDescending
}

したがって、ifステートメントを使用できます。

if result == .OrderedSame {
    println("equal")
} else {
    println("not equal")
}

正しく思い出せば、範囲とロケールのパラメーターはオプションであり、完全に省略できます。
Mick MacCallum、2015年

3
はい、確かに、すべてのパラメーターを使用してメソッド全体を表示したいと思いました。
グレッグ

ここに正しい答えがあるはずです。文字列を比較することは、それらが等しいかどうかを知ることだけではありません
ミカエル

181

これを試して :

古いスイフトの場合:

var a : String = "Cash"
var b : String = "cash"

if(a.caseInsensitiveCompare(b) == NSComparisonResult.OrderedSame){
    println("voila")
}

Swift 3以上

var a : String = "Cash"
var b : String = "cash"

if(a.caseInsensitiveCompare(b) == .orderedSame){
    print("voila")
}

13
Swift 3では使用する必要がありますa.caseInsensitiveCompare(b) == ComparisonResult.orderedSame
azhidkov '17

2
注:caseInsensitiveCompare(_:)はSwift標準ライブラリに含まれていません。Foundationフレームワークの一部であるため、が必要import Foundationです。
chrisamanse 2016年

これがこれより優れている理由はありますa.lowercased() == b.lowercased()か?
ジョーイ

36

使用caseInsensitiveCompare方法:

let a = "Cash"
let b = "cash"
let c = a.caseInsensitiveCompare(b) == .orderedSame
print(c) // "true"

ComparisonResultは、どの単語が辞書式順序で他の単語よりも早いかを示します(つまり、どれが辞書の先頭に近いか)。.orderedSame文字列が辞書の同じ場所に配置されることを意味します


どういう.orderedSame意味?ドキュメントはちょうど言う2つのオペランドが等しいです。しかし、なぜ「注文」という言葉がここで使用されているのでしょうか。シーケンスか何かはありますか?そして何が左のオペランドは右のオペランドよりも小さいです。.orderedAscending)文字列の平均
Honey

1
@Honeyの比較結果は、どの単語が辞書式順序で他の単語よりも先に来るか(つまり、どちらが辞書の前に来るか)を示します。.orderedSame文字列が辞書の同じ場所に配置されることを意味します。
dasblinkenlight

1
@はちみつ .orderedSameは略してComparisonResult.orderSame...コンパイラはをcaseInsensitiveCompare返すことを知っているので、型に名前を付ける必要はありませんComparisonResult。「2つのオペランドは等しい」-特定の順序に従って等しい...明らかに、「Cash」と「cash」は同一の文字列値ではありません。「しかし、なぜここで「秩序」という言葉が使われるのですか?」-順序付けされた比較の結果だからです。他の価値観orderedAscendingとはorderedDescending...同じか異なるかという問題だけではありません。「小さい」と同様に、文字列は大きな底の数字のようなものです。
ジムBalter

1
これはひどいAPIデザインだと思います。署名は読みにくい...それa.caseInsensitiveCompare(b, comparing: .orderedSame)をもっと読みやすくすることだろう...
ハニー

25
if a.lowercaseString == b.lowercaseString {
    //Strings match
}

2
Pure Swiftはここに行く方法です。基礎は必要ありません。
アレクサンダー-2016

2
大文字と小文字を変換して比較するのは間違っています。質問の下のコメントを参照してください。
ジムバルター2017

1
@JimBalter OPの質問の例に答えているので、「間違っている」とは言えません。ローカリゼーションをサポートする必要がない私たちにとっては、これははるかにきれいです!
toddg 2018

4
^いいえ、それは間違っています。1つの例で何かがうまくいっていることは無関係です。このハックは「クリーン」ではありません。受け入れられた答えは、正しい、クリーンなソリューションを提供します。
ジムBalter

8

正しい方法:

let a: String = "Cash"
let b: String = "cash"

if a.caseInsensitiveCompare(b) == .orderedSame {
    //Strings match 
}

注意: ComparisonResult.orderedSameは、.orderedSameと略記することもできます。

他の方法:

a。

if a.lowercased() == b.lowercased() {
    //Strings match 
}

b。

if a.uppercased() == b.uppercased() {
    //Strings match 
}

c。

if a.capitalized() == b.capitalized() {
    //Strings match 
}

7

あなた自身を転がすことができます:

func equalIgnoringCase(a:String, b:String) -> Bool {
    return a.lowercaseString == b.lowercaseString
}

3
大文字と小文字を変換して比較するのは間違っています。質問の下のコメントを参照してください。
ジムバルター2017

6

localizedCaseInsensitiveContains:大文字と小文字を区別せず、ロケールに対応した検索を実行して、レシーバーが指定された文字列を含むかどうかを返します

if a.localizedCaseInsensitiveContains(b) {
    //returns true if a contains b (case insensitive)
}

編集

caseInsensitiveCompare:NSCaseInsensitiveSearchを唯一のオプションとしてcompare(_:options :)を呼び出した結果を返します。

if a.caseInsensitiveCompare(b) == .orderedSame {
    //returns true if a equals b (case insensitive)
}

1
問題は、封じ込めではなく、比較についてです。
ジムBalter

場合は、「Bが含まれている」「bが含まれている」、彼らは同じです。したがって、これが最も効果的なものでなくても、確かにこれは可能な解決策です。
Philipp Maurer、2018年

1

すべての文字を大文字(または小文字)にして、それらが同じかどうかを確認することもできます。

var a =Cashvar b =CAShif a.uppercaseString == b.uppercaseString{
  //DO SOMETHING
}

これにより、両方の変数”CASH”が同じになるため、両方の変数が等しくなります。

また、String拡張を行うことができます

extension String{
  func equalsIgnoreCase(string:String) -> Bool{
    return self.uppercaseString == string.uppercaseString
  }
}

if "Something ELSE".equalsIgnoreCase("something Else"){
  print("TRUE")
}

3
大文字と小文字を変換して比較するのは間違っています。質問の下のコメントを参照してください。
ジムバルター2017

1

電話番号の比較例。Swift 4.2の使用

var selectPhone = [String]()

if selectPhone.index(where: {$0.caseInsensitiveCompare(contactsList[indexPath.row].phone!) == .orderedSame}) != nil {
    print("Same value")
} else {
    print("Not the same")
}

0

Swift 4、私はcaseInsensitiveCompare()をテンプレートとして使用して文字列拡張ルートを使用しました(ただし、オペランドをオプションにすることができます)。これは、私がそれを組み立てるために使用した遊び場です(Swiftの新機能なので、歓迎以上のフィードバックがあります)。

import UIKit

extension String {
    func caseInsensitiveEquals<T>(_ otherString: T?) -> Bool where T : StringProtocol {
        guard let otherString = otherString else {
            return false
        }
        return self.caseInsensitiveCompare(otherString) == ComparisonResult.orderedSame
    }
}

"string 1".caseInsensitiveEquals("string 2") // false

"thingy".caseInsensitiveEquals("thingy") // true

let nilString1: String? = nil
"woohoo".caseInsensitiveEquals(nilString1) // false

2
.orderedSame代わりに使用できますComparisonResult.orderedSame
ジムBalter

0

わずか数行のコードで比較のために文字列拡張を書くことができます

extension String {

    func compare(_ with : String)->Bool{
        return self.caseInsensitiveCompare(with) == .orderedSame
    } 
}

0

Swift 5の場合ケースを無視して2つの文字列を比較する

var a = "cash"
var b = "Cash"
if(a.caseInsensitiveCompare(b) == .orderedSame){
     print("Ok")
}


-1

Swift 3:独自の演算子を定義できます~=

infix operator ~=

func ~=(lhs: String, rhs: String) -> Bool {
   return lhs.caseInsensitiveCompare(rhs) == .orderedSame
}

その後、遊び場で試すことができます

let low = "hej"
let up = "Hej"

func test() {
    if low ~= up {
        print("same")
    } else {
        print("not same")
    }
}

test() // prints 'same'

私はこれに反対票を投じませんでしたが、上記のカスタムパターンマッチング演算子は、Stringインスタンスを互いに(または他のStringリテラルに)マッチングするときに通常使用されるネイティブパターンマッチングよりも優先されるため、これは一般にかなり悪い考えです。let str = "isCAMELcase"次のようなケースで切り替えられることを想像してくださいcase "IsCamelCase": ... 。上記の方法を使用caseすると、これは正常に入力されます。これは、Stringパターンマッチングの標準libs実装からの予想ではありません。更新されたSwift 3の答えはまだ良いですが、...
dfri

... StringデフォルトのStringパターンマッチングを上書きするのではなく、上記のヘルパーとしてカスタム関数(または拡張機能)を使用することを検討してください。
dfri 2017

-1
extension String
{
    func equalIgnoreCase(_ compare:String) -> Bool
    {
        return self.uppercased() == compare.uppercased()
    }
}

使用例

print("lala".equalIgnoreCase("LALA"))
print("l4la".equalIgnoreCase("LALA"))
print("laLa".equalIgnoreCase("LALA"))
print("LALa".equalIgnoreCase("LALA"))

1
これは一部の言語の一部の文字列では機能しません...質問の下のコメントと多くの正解を参照してください。
ジムBalter

-2

スウィフト3:

2つの文字列関数間でローカライズされた大文字と小文字を区別しない比較を使用することもできます。 Bool

var a = "cash"
var b = "Cash"

if a.localizedCaseInsensitiveContains(b) {
    print("Identical")           
} else {
    print("Non Identical")
}

2
あなたの解決策は間違っています。文字列「casha」と「Cash」を考えてみましょう
clarkcox3 '13 / 04/18
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.