首页 > 解决方案 > 正则表达式不允许在字符串 swift ios 中盯着空格

问题描述

我想创建允许字符数字和空格的正则表达式,但不是在字符串的开头,我已经创建了一个但它不起作用"^\\S.*[^A-Za-z0-9_ ].*"

迅速:

func containsAllowedCharacters(regex: String?, stringToCheck: String) -> Bool {
    var isValid = false
    if let regex = regex {
        let testString = NSPredicate(format: "SELF MATCHES %@", regex)
        isValid = testString.evaluate(with: stringToCheck)
    }
    return !isValid
}

标签: iosswiftregex

解决方案


您的模式 ,^\S.*[^A-Za-z0-9_ ].*与字符串开头匹配^,然后与任何非空白字符\S匹配(注意它匹配任何标点符号、字母和数字),然后匹配除换行符以外的任何零个或多个字符,与.*, 然后匹配除 ASCII 字母、数字_或空格之外的任何字符,然后再次匹配除换行符以外的任何零个或多个字符,与.*.

如您所见,所有模式部分的匹配程度超出了您的允许范围。另外,请注意,您实际上需要至少两个字符与此模式一起出现,而您的代码暗示您也需要支持零长度字符串。

您可以使用

let FileNameRegex = #"^(?!\s)[A-Za-z0-9_\s]*$"#

注意:当您在 中使用它时MATCHESNSPredicate.evaluate您不需要两端的^and锚点,因为需要完整的字符串匹配:$MATCHES

let FileNameRegex = #"(?!\s)[A-Za-z0-9_\s]*"#
let testString = NSPredicate(format: "SELF MATCHES %@", regex)

请注意#"..."#生成原始字符串文字的符号的使用,其中单个反斜杠被解析为文字反斜杠。

模式匹配

  • ^- 字符串的开始
  • (?!\s)- 与字符串中未紧跟空格的位置匹配的负前瞻
  • [A-Za-z0-9_\s]*-零个或多个(由于*量词)ASCII 字母、数字、下划线和空格
  • $- 字符串结束。

推荐阅读