我正在尝试确定输入字符串是否包含" n' t"或者"不是"。 例如,如果输入是:
let part = "Hi, I can't be found!"
我想找到否定的存在。 我尝试过input.contains,.range和NSRegularExpression。所有这些都成功地找到了#34;而不是"但未能找到" n&#t;#34;。我也试过逃避这个角色。
'//REGEX:
let negationPattern = "(?:n't|[Nn]ot)"
do {
let regex = try NSRegularExpression(pattern: negationPattern)
let results = regex.matches(in: text,range: NSRange(part.startIndex..., in: part))
print("results are \(results)")
negation = (results.count > 0)
} catch let error {
print("invalid regex: \(error.localizedDescription)")
}
//.CONTAINS
if part.contains("not") || part.contains("n't"){
print("negation present in part")
negation = true
}
//.RANGE (showing .regex option; also tried without)
if part.lowercased().range(of:"not", options: .regularExpression) != nil || part.lowercased().range(of:"n't", options: .regularExpression) != nil {
print("negation present in part")
negation = true
}
这是一张图片:
答案 0 :(得分:1)
这有点棘手,屏幕截图实际上是什么让它离开:你的正则表达式模式中有一个简单的单引号,但输入文本有一个" smart"或者"卷曲"撇号在里面。差异很微妙:
许多文本字段会自动替换常规单引号" smart"撇号时他们认为合适。然而,你的正则表达式只匹配普通单引号,正如这个微小的测试证明的那样:
func isNegation(input text: String) -> Bool {
let negationPattern = "(?:n't|[Nn]ot)"
let regex = try! NSRegularExpression(pattern: negationPattern)
let matches = regex.matches(in: text,range: NSRange(text.startIndex..., in: text))
return matches.count > 0
}
for input in ["not", "n't", "n’t"] {
print("\"\(input)\" is negation: \(isNegation(input: input) ? "YES" : "NO")")
}
打印:
"not" is negation: YES
"n't" is negation: YES
"n’t" is negation: NO
如果您想继续使用正则表达式解决此问题,您需要修改它以匹配此类标点字符,并避免假设您的所有输入文本都包含" plain"单引号。