2017-05-29 46 views
0

我的函數應該處理每個正則表達式並返回true或false。這是行之有效的...現在仍然正則表達式不能用於空字符串 - 斯威夫特

func test(_ input: String) -> Bool { 

let pattern = ".{7}" //allow exactly 7 numbers 
let regex = try! NSRegularExpression(pattern: pattern, options: [NSRegularExpression.Options.caseInsensitive]) 


let leftover = regex.stringByReplacingMatches(in: input, options: [], range: NSMakeRange(0, input.characters.count), withTemplate: "") 

if leftover.isEmpty { 
    return true 
} 
return false 
} 


print(test("123456")) //false 
print(test("1234567")) //true 
print(test("12345678")) //false 
print(test("")) //true - I expect false 

所以我明白爲什麼test("")是錯誤的。但是,我怎樣才能修復我的正則表達式,它返回false? 有時我使用正則表達式.*我的函數也應該處理這個。所以我不能在你的正則表達式添加^$作出這樣

if input.isEmpty { return false }

+0

我會加入「^」和「$」(如果我沒記錯correclty我正則表達式),以您的正則表達式來表示,就是需要使用從開始到結束的字符串去,而且我改爲調用'numberOfMatchesInString:options:range:'。 – Larme

+0

只更改正則表達式不起作用。我會嘗試numberOfMatchesInString:options:range – kuzdu

+0

當然,只有其中一個選項不起作用,我會說「和」。所以'let pattern =「^。{7} $」//準確地說7個數字;讓正則表達式=嘗試! NSRegularExpression(pattern:pattern,options:[.caseInsensitive]);讓numberOfOccurences = regex.numberOfMatches(in:input,options:[],range:NSMakeRange(0,input.characters.count));返回(numberOfOccurences!= 0)'訣竅。 – Larme

回答

2

如果input是空字符串,那麼leftover也是空字符串 ,因此您的函數返回true。其中 你的方法失敗,另一種情況是

print(test("12345671234567")) // true (expected: false) 

另一種方法是使用的Stringrange(of:)方法與.regularExpression選項。然後檢查匹配的範圍是否是整個字符串。

爲了匹配7個位數(而不是7任意字符),則 圖案應該是\d{7}

func test(_ input: String) -> Bool { 

    let pattern = "\\d{7}" 
    return input.range(of: pattern, options: [.regularExpression, .caseInsensitive]) 
      == input.startIndex..<input.endIndex 
} 
2

一種解決方法是指定您的正則表達式必須匹配整個字符串是有效的,所以你可以做這樣的檢查以確保字符串的開始和結束。

let pattern = "^.{7}$" //allow exactly 7 numbers 
let regex = try! NSRegularExpression(pattern: pattern, options: [.caseInsensitive]) 
let numberOfOccurences = regex.numberOfMatches(in: input, options: [], range: NSMakeRange(0, input.utf16.count)) 
return (numberOfOccurences != 0) 

從理論上講,我們應該檢查是否numberOfOccurences確實等於1時返回true,但檢查的開始和結束應該給你只有一個或零匹配。

+2

請注意,它應該是'input.utf16.count':NSRange計算NSString中的字符(unichar)。 –

+1

@MartinR謝謝,並修復;) – Larme