2016-04-11 41 views
1

我有這樣的文字中,我需要在第一線正則表達式只返回數字上升到一個新行字符

+1-415-655-0001 US TOLL Access code: 197 703 792

的正則表達式我有隻提取數字只是提取所有數字 /d+

var noteStr = "1-415-655-0001 US TOLL\n\nAccess code: 197 703 792" 

findCodeInWord() 

func findCodeInWord() -> String? 
{ 
    let regex = try! NSRegularExpression(pattern: "\\d+", options: []) 

    var items = [String]() 
    regex.enumerateMatchesInString(noteStr, options: [], range: NSMakeRange(0, noteStr.characters.count)) { result, flag, stop in 
     guard let match = result else { 
      // result is nil 
      return 
     } 

     let range = match.rangeAtIndex(0) 
     var matchStr = (noteStr as NSString).substringWithRange(range) 
     print(matchStr) 
    } 
    return items.joinWithSeparator("") 

} 

但是這將返回所有數字。我只希望它返回14156550001

+0

使用'[^ 0-9] +'因爲你的正則表達式和替換字符串爲空。我不知道斯威夫特但顯然有一個函數,該函數。見http://stackoverflow.com/questions/28503449/swift-replace-substring-regex – shawnt00

回答

1

可以與基於\G操作者的單個正則表達式提取這些數字和捕獲所述數字到第1組:

\G(?:[^\d\n\r]*(\d+)) 

regex demo,它將只捕捉到第1組的數字序列(1個或多個,與(\d+)),這些在第一行,由於操作者\G使得在字符串的開始在每一個帥客的端部相匹配,然後ssful匹配比的數字,LF或CR其他的[^\d\n\r]*字符類匹配0+字符。

因此,啓動時相匹配,1是發現和捕獲,然後-[^\d\n\r]*匹配,則415匹配和捕獲等。當遇到\n,沒有更多的匹配被找到時,\G錨失敗,因此整個正則表達式搜索停在第一行。

斯威夫特:

let regex = try! NSRegularExpression(pattern: "\\G(?:[^\\d\n\r]*(\\d+))", options: []) 
... 
let range = match.rangeAtIndex(1) 
+1

感謝Wiktor的!這正是我所期待的。 +1來解釋它。很有幫助! – Tony

1

「我有這樣的文字中,我需要提取僅在第一行數字」

雖然正則表達式是有時非常有用,對於簡單的任務,從給定的字符串只提取的字符數,雨燕本地pattern matching是一個有用的工具;這裏通過9號碼0UnicodeScalar表示適當是在序列:

var noteStr = "1-415-655-0001 US TOLL\n\nAccess code: 197 703 792" 

/* since we're using native pattern matching, let's use a native method 
    also when extracting the first row (even if this is somewhat simpler 
    if using Foundation bridged NSString methods)       */ 
if let firstRowChars = noteStr.characters.split("\n").first, 
    case let firstRow = String(firstRowChars) { 

    // pattern matching for number characters 
    let pattern = UnicodeScalar("0")..."9" 
    let numbers = firstRow.unicodeScalars 
     .filter { pattern ~= $0 } 
     .reduce("") { String($0) + String($1) } 

    print(numbers) // 14156550001 

    /* Alternatively use .reduce with an inline if clause directly: 
    let numbers = firstRow.unicodeScalars 
     .reduce("") { pattern ~= $1 ? String($0) + String($1) : String($0)} */ 
} 
相關問題