2015-04-04 59 views
0

如何检查我的字符串是否仅包含[0-9].
我想要从我的字符串中删除所有其他符号。 如果用户输入的字符串的任何Swift - 从字符串中提取双精度值

var anyString:String = “3f00b6r.beAwes0me4me” 

欲从中提取所有的数字(包括一个.如果存在的话),并删除所有其他字符。

var myDouble:Double = 3006.04 

有人知道如何做到这一点?

+0

您的标题询问有关“double”的字符串。问题的主体询问只包含数字和'.'的字符串。这些是非常不同的东西。考虑字符串'''''','''''',''1..2“','”1.2.3.4.5“'和”“1.2e34”'。您需要更准确地定义问题,然后才能解决问题。 – 2015-04-05 09:00:08

+0

如果字符串是“sdfhj23sdfjisadfsdf.13mdsiafaisdfj”我只想要23.13 – 2015-04-05 12:27:15

+0

如果字符串是'“foo1.2.3.4bar”'你想''1.2.3.4“',对不对?那么“双”与它有什么关系? – 2015-04-05 18:33:40

回答

5

您可以使用NSRegularExpression,像这样:

// First set up error for checking 
var error:NSError? 

// Create regular expression pattern to search for numbers one digit in length or longer 
let regexString = NSRegularExpression(pattern: "[0-9]{1,}.[0-9]{1,}|[0-9]{1,}", options: nil, error: &error) 
// example string 
let string = "find the number 10.19" 
// get the string length 
let strLength = count(string) 
// To return the result first of all obtain the range of the first match if there is one, if let used here because NSRegularExpression returns an optional (we could of checked earlier, but I didn't) 
if let rangeOfFirstMatch = regexString?.rangeOfFirstMatchInString(string, options: nil, range: NSMakeRange(0, strLength)) 
{ 
    // if a range has been found that isn't equal to NSNotFound then build a range for the found string 
if !NSEqualRanges(rangeOfFirstMatch, NSMakeRange(NSNotFound, 0)) { 
advance(string.startIndex, rangeOfFirstMatch.length) 
    let r = Range(start: advance(string.startIndex, rangeOfFirstMatch.location), end: advance(string.startIndex, rangeOfFirstMatch.location+rangeOfFirstMatch.length)) 
// return the value 
    let substringForFirstMatch = string.substringWithRange(r) 
    println("Here's your match: \(substringForFirstMatch)") 
    } 
} 

还有String.stringByTrimmingCharactersInSet()这将是更清洁,速度快,但不是多才多艺。例如,如果你这样做上面的字符串也将返回:

let set = NSMutableCharacterSet.alphanumericCharacterSet() 
set.addCharactersInString(" ") 
set.removeCharactersInString(".") 

string.stringByTrimmingCharactersInSet(set) 

但如果字符串改为“找到数?? ... 10.19 ....”,那么stringByTrimmingCharactersInSet()将让你down并返回"??...10.19....",而正则表达式版本将会保留。

为了让事情变得更容易的String分机号可以写成这样对类型的字符串返回多个号码双人或诠释:

extension String { 

    func stringsMatchingRegularExpression(expression exp:String, error err:NSErrorPointer) -> [String]? { 
     var strArray:[String]? 
     var rangeArray:[NSRange]? 
     let strLength = count(self) 
     var startOfRange = 0 
     if let regexString = NSRegularExpression(pattern: exp, options: nil, error: err) { 

      while startOfRange <= strLength { 
       let rangeOfMatch = regexString.rangeOfFirstMatchInString(self, options: nil, range: NSMakeRange(startOfRange, strLength-startOfRange)) 
       if let rArray = rangeArray { 
        rangeArray = rArray + [rangeOfMatch] 
       } 
       else { 
        rangeArray = [rangeOfMatch] 
       } 
       startOfRange = rangeOfMatch.location+rangeOfMatch.length 


      } 
      if let ranArr = rangeArray { 
       for r in ranArr { 

        if !NSEqualRanges(r, NSMakeRange(NSNotFound, 0)) { 
         advance(self.startIndex, r.length) 
         let r = Range(start: advance(self.startIndex, r.location), end: advance(string.startIndex, r.location+r.length)) 
         // return the value 
         let substringForMatch = self.substringWithRange(r) 
         if let sArray = strArray { 
          strArray = sArray + [substringForMatch] 
         } 
         else { 
          strArray = [substringForMatch] 
         } 

        } 

       } 
      } 
     } 
     return strArray 
    } 
} 
let myString = "one number is 7.5, another is 20" 
let subStringArray = myString.stringsMatchingRegularExpression(expression: "[0-9]{1,}.[0-9]{1,}|[0-9]{1,}", error: nil) 
subStringArray?[0] // 7.5 
subStringArray?[1] // 20 

雨燕2.0更新扩展

extension String { 

    func stringsMatchingRegularExpression(expression exp:String) -> [String]? { 
     var strArray:[String]? 
     var rangeArray:[NSRange]? 
     let strLength = self.characters.count 
     var startOfRange = 0 
     do { 
     let regexString = try NSRegularExpression(pattern: exp, options: []) 
      while startOfRange <= strLength { 
       let rangeOfMatch = regexString.rangeOfFirstMatchInString(self, options: [], range: NSMakeRange(startOfRange, strLength-startOfRange)) 
       if let rArray = rangeArray { 
        rangeArray = rArray + [rangeOfMatch] 
       } 
       else { 
        rangeArray = [rangeOfMatch] 
       } 
       startOfRange = rangeOfMatch.location+rangeOfMatch.length 


      } 
      if let ranArr = rangeArray { 
       for r in ranArr { 

        if !NSEqualRanges(r, NSMakeRange(NSNotFound, 0)) { 
         self.startIndex.advancedBy(r.length) 
         let r = Range(start: self.startIndex.advancedBy(r.location), end: self.startIndex.advancedBy(r.location + r.length)) 

         // return the value 
         let substringForMatch = self.substringWithRange(r) 
         if let sArray = strArray { 
          strArray = sArray + [substringForMatch] 
         } 
         else { 
          strArray = [substringForMatch] 
         } 

        } 

       } 
      } 
     }  catch { 
     } 




     return strArray 
    } 
} 
let myString = "one number is 7.5, another is 20" 
let subStringArray = myString.stringsMatchingRegularExpression(expression: "[-+]?\\d+.?\\d+") 
subStringArray?[0] // 7.5 
subStringArray?[1] // 20 

Swift 3.0扩展更新

extension String { 

    func stringsMatchingRegularExpression(expression exp:String) -> [String]? { 
     var strArray:[String]? 
     var rangeArray:[NSRange]? 
     let strLength = self.characters.count 
     var startOfRange = 0 
     do { 
      let regexString = try NSRegularExpression(pattern: exp, options: []) 
      while startOfRange <= strLength { 
       let rangeOfMatch = regexString.rangeOfFirstMatch(in: self, options: [], range: NSMakeRange(startOfRange, strLength-startOfRange)) 
       if let rArray = rangeArray { 
        rangeArray = rArray + [rangeOfMatch] 
       } 
       else { 
        rangeArray = [rangeOfMatch] 
       } 
       startOfRange = rangeOfMatch.location+rangeOfMatch.length 


      } 
      if let ranArr = rangeArray { 
       for r in ranArr { 

        if !NSEqualRanges(r, NSMakeRange(NSNotFound, 0)) { 
         self.index(startIndex, offsetBy: r.length) 

         let r = self.index(startIndex, offsetBy:r.location)..<self.index(startIndex, offsetBy:r.location + r.length) 

         // return the value 
         let substringForMatch = self.substring(with: r) 
         if let sArray = strArray { 
          strArray = sArray + [substringForMatch] 
         } 
         else { 
          strArray = [substringForMatch] 
         } 

        } 

       } 
      } 
     } 
     catch { 
     // catch errors here 
     } 

     return strArray 
    } 
} 
let myString = "one number is 7.5, another is 20" 
let subStringArray = myString.stringsMatchingRegularExpression(expression: "[-+]?\\d+.?\\d+") 
subStringArray?[0] // 7.5 
subStringArray?[1] // 20 
+0

如果字符串中的数字是.75,该怎么办?有没有办法解压?现在.75返回为75.0。感谢您的上述代码! – BriOnH 2017-01-11 19:21:32

+0

@BriOnH你可以使用这样的正则表达式字符串:'“[+ - ]?\\。?\\ d +(\\。\\ d +)?”' – sketchyTech 2017-01-13 10:33:30