2017-11-15 10 views
1

유효한 비트 코인 주소 인 경우 true 또는 false를 반환하는 함수를 작성하려고합니다.Bitcoin 주소 확인을위한 정규식

비트 코인 :

나는 현재이 같은 문자열을 반환하는 QR 코드 스캐너가

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 
    } 
} 

불행하게도이 때마다 false를 반환한다 : 18YCdhPsd5gdf6WD4ioMZZJKTNdajUJyTM

를 여기 제 기능입니다. 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

.

사용하여 다음

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

당신은 : 이후 부분 만에 정규 표현식과 일치해야합니다 당신은 fullAddress[1] 대신 패턴에 self을 비교하는

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