2017-11-15 12 views
1

有効なビットコインアドレスであれば真または偽を返す関数を記述しようとしています。ビットコインアドレスを検証するための正規表現

ビットコイン:このような文字列を返す

私は現在、QRコードスキャナを持って18YCdhPsd5gdf6WD4ioMZZJKTNdajUJyTM

は、ここに私の機能です:

func isValidBitcoinAddress() -> Bool { 
    var fullAddress = self.components(separatedBy: ":") 
    let r = fullAddress[1].startIndex..<fullAddress[1].endIndex 
    let pattern = "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$" 
    let r2 = self.range(of: pattern, options: .regularExpression) 
    if r2 == r { 
     return true 
    } else { 
     return false 
    } 
} 

残念ながら、これは偽のたびに戻っています。

私はこのサイトから正規表現のパターを得た:http://mokagio.github.io/tech-journal/2014/11/21/regex-bitcoin.html

はスウィフトで、おそらく別のフォーマットですか?

ありがとうございます!

+0

'fullAddress [1] .startIndex .. ' fullAddressは、[1]これはのように思える – Alexander

+1

.indices'弱いタイプ。 'String'に' isValidBitcoinAddress'メソッドを追加するのではなく、 'String'をラップする' BitcoinAddress'と呼ばれる構造体を作ることを検討し、与えられた文字列が有効なアドレスであれば成功する初期化子を提供します。そこから、あなたのアプリケーションは 'BitcoinAddress'インスタンスだけで動作することができ、文字列を使用するのではなく、すべての時間をチェックする必要がなく、それらが有効なアドレスになることが確実です。 – Alexander

+0

チップをありがとう! – KrispyK

答えて

0

あなたが代わりにfullAddress[1]のパターンにselfを比較しています。

次を使用します。

func isValidBitcoinAddress() -> Bool { 
    let fullAddress = self.components(separatedBy: ":") 
    if fullAddress.count == 2 && fullAddress[0] == "bitcoin" { 
     let pattern = "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$" 
     let r = fullAddress[1].startIndex..<fullAddress[1].endIndex 
     let r2 = fullAddress[1].range(of: pattern, options: .regularExpression) 
     return r == r2 
    } else { 
     return false 
    } 
} 
+1

なぜ実際に動作し、問題を解決する答えに投票したのですか? – rmaddy

1

あなたは:後に一部だけに正規表現と一致する必要があります。

extension String { 
    func isValidBitcoinAddress() -> Bool { 
     let addressComponents = self.components(separatedBy: ":") 
     guard addressComponents.count == 2, 
       addressComponents[0] == "bitcoin" else { 
      return false 
     } 

     let address = addressComponents[1] 

     let pattern = "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$" 
     let range = address.range(of: pattern, options: .regularExpression) 
     return range == address.indices 
    } 
} 
1

@rmaddyと@Alexanderは、あなたの質問に答えています。私はちょうど私の実装コードを追加してい

func isValidBitcoinAddress(stringBitCoinID:String) -> Bool { 
    let fullAddress = stringBitCoinID.components(separatedBy: ":") 

    guard fullAddress.count == 2, fullAddress[0] == "bitcoin" else { 
     return false 
    } 

    let r = fullAddress[1] 
    let pattern = "^[13][a-km-zA-HJ-NP-Z1-9]{25,34}$" 

    let bitCoinIDTest = NSPredicate(format:"SELF MATCHES %@", pattern) 
    let result = bitCoinIDTest.evaluate(with: r) 

    return result 
} 
+0

このコードは ':'がない文字列ではクラッシュします。 – rmaddy

+0

申し訳ありません@rmaddyはそのシナリオをチェックしませんでした。 'guard'文を追加するとどうなりますか? – Amit

+0

競合する型に対してresult = bitCoinIDTest.evaluate(with:r)という行にエラーが発生しました。 – KrispyK