繁体   English   中英

如何在Swift中创建类似于Ruby中的扫描的函数

[英]How can I create a function in Swift that is similar to scan in Ruby

我是新手,它正在寻找一种基于正则表达式匹配的将字符串分离为数组的有效方法。

在Ruby中,它是一行命令

irb(main):006:0> number = "(123) 456-7890"
=> "(123) 456-7890"
irb(main):007:0> number.scan(/(\w+)/).join()
=> "1234567890"
irb(main):008:0> 

在Swift中,它很复杂,我从这里的答案中使用了此函数, Swift提取正则表达式匹配将组件分成String数组。 联接的工作方式相同,因此至少是好的。 快速有扫描功能吗? 如果没有,如何创建可以使用的全局函数。

func matchesForRegexInText(regex: String!, text: String!) -> [String] {

    let regex = NSRegularExpression(pattern: regex,
        options: nil, error: nil)!
    let nsString = text as NSString
    let results = regex.matchesInString(nsString as String,
        options: nil, range: NSMakeRange(0, nsString.length))
        as! [NSTextCheckingResult]
    return map(results) { nsString.substringWithRange($0.range)}
}

var number = "(123) (456) 7890"    
var wordArr = matchesForRegexInText("\\w+", number)
join("",wordArr) #> "1234567890"

String没有类似的scan()方法,但是您可以使用相同的方法轻松地定义一个:

extension String {
    func scan(regex : String) -> [String] {
        let regex = NSRegularExpression(pattern: regex,
            options: nil, error: nil)!
        let nsString = self as NSString
        let results = regex.matchesInString(nsString as String,
            options: nil, range: NSMakeRange(0, nsString.length))
            as! [NSTextCheckingResult]
        return map(results) { nsString.substringWithRange($0.range)}
    }
}

例:

let number = "(123) (456) 7890"
let wordArr = number.scan("\\w+")
println(wordArr) // [123, 456, 7890]

let digitsOnly = "".join(wordArr)
println(digitsOnly) // 1234567890

你可以做:

let s = "(123) 456-7890"
let ns = s.stringByReplacingOccurrencesOfString(
    "\\D", withString: "", options: .RegularExpressionSearch)
//ns="1234567890"

更新: Xcode 7.2•Swift 2.1.1

extension String {
    var decimalDigits: String {
        return componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet()
            .invertedSet)
            .joinWithSeparator("")
    }
}

let inputString = "(123) 456-7890"   // "1234567890"
print(inputString.numbersOnly)   // "1234567890"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM