正则表达式不适用于空字符串 - Swift

时间:2017-05-29 08:19:24

标签: regex swift

我的函数应该处理每个正则表达式并返回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 }

2 个答案:

答案 0 :(得分: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,但检查开始和结束应该只给你一个或零匹配。

答案 1 :(得分:2)

如果input为空字符串,则leftover将为空字符串 同样,因此你的函数返回true。另一种情况 你的方法失败了

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

另一种方法是使用range(of:) String .regularExpression方法和\d{7}选项。然后检查匹配的范围是否是整个字符串。

为了匹配7个数字(而不是7个任意字符), 模式应为func test(_ input: String) -> Bool { let pattern = "\\d{7}" return input.range(of: pattern, options: [.regularExpression, .caseInsensitive]) == input.startIndex..<input.endIndex }

TEAMCITY_SERVER_MEM_OPTS=-Xmx4g -XX:MaxPermSize=270m -XX:ReservedCodeCacheSize=350m