2015-04-04 60 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