【问题标题】:Regular Expression for Validating Bitcoin Addresses验证比特币地址的正则表达式
【发布时间】:2018-04-28 05:56:29
【问题描述】:

我正在尝试编写一个函数,如果它是有效的比特币地址,则返回 true 或 false。

我目前有一个二维码扫描仪,它返回如下字符串:

比特币: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
    }
}

不幸的是,这每次都返回 false。

我从这个网站获得了 RegEx 模式:http://mokagio.github.io/tech-journal/2014/11/21/regex-bitcoin.html

Swift 中的格式可能不同吗?

谢谢!

【问题讨论】:

  • fullAddress[1].startIndex..&lt;fullAddress[1].endIndex -> fullAddress[1].indices
  • 这似乎是一个弱类型。与其将方法添加到isValidBitcoinAddressString,不如考虑创建一个名为BitcoinAddress 的结构,它包装String,并提供一个可失败的初始化程序,如果提供给它的字符串是有效地址,则该初始化程序成功。从那里开始,您的应用程序只能使用 BitcoinAddress 实例,并且可以确定它们是有效地址,而不是使用字符串并且必须一直检查。
  • 感谢您的提示!

标签: swift nsregularexpression


【解决方案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
    }
}

【讨论】:

    【解决方案2】:

    您将self 与模式进行比较,而不是fullAddress[1]

    使用以下内容:

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

    【讨论】:

    • 为什么对实际有效并解决问题的答案投反对票?
    【解决方案3】:

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

    【讨论】:

    • 这段代码对于任何没有:的字符串都会崩溃。
    • 抱歉@rmaddy 没有检查那个场景。添加guard 语句可以吗?
    • let result = bitCoinIDTest.evaluate(with: r) 行出现错误,用于冲突类型。
    • 我在 swift 3.2 中使用您的比特币字符串使用此代码,它返回是。
    猜你喜欢
    • 2014-03-08
    • 2019-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    • 2012-07-12
    • 2014-02-28
    • 1970-01-01
    相关资源
    最近更新 更多