找不到子串" n' t"

时间:2018-03-12 00:14:58

标签: swift string substring

我正在尝试确定输入字符串是否包含" 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
}

这是一张图片:

enter image description here

1 个答案:

答案 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"单引号。