代码之家  ›  专栏  ›  技术社区  ›  aircraft

RegExp结果不是我所期望的

  •  0
  • aircraft  · 技术社区  · 8 年前

    我的regExp没有得到正确的结果,我找不到哪里有错误。

        let ori_str = "abcXabcYabcZ"  // there are 3 Capital character
    
        let pattern = "[A-Z]"
    
        let regular = try!NSRegularExpression(pattern: pattern, options: .caseInsensitive)
    
        let results = regular.matches(in: ori_str, options: .reportProgress , range: NSMakeRange(0, ori_str.characters.count))
        print("results have: \(results.count) count")  // log  'result have: 12 count'  why 12 without 3 ???
    

    我想获取大写字符,然后将它们替换为 -(the Capital character's lower character)- ,但我的regExp的结果是控制台12个大写字符计数。

    1) 你看,应该是3,错误在哪里?
    2) 如何将大写字符替换为 -(the capital's lower character)- ?


    加法-1

    有所有的 NSRegularExpression.Options 下文:

        public static var caseInsensitive: NSRegularExpression.Options { get }
    
        public static var allowCommentsAndWhitespace: NSRegularExpression.Options { get }
    
        public static var ignoreMetacharacters: NSRegularExpression.Options { get }
    
        public static var dotMatchesLineSeparators: NSRegularExpression.Options { get }
    
        public static var anchorsMatchLines: NSRegularExpression.Options { get }
    
        public static var useUnixLineSeparators: NSRegularExpression.Options { get }
    
        public static var useUnicodeWordBoundaries: NSRegularExpression.Options { get }`
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   kevin    8 年前

    您需要进行区分大小写的匹配。 将选项从不区分大小写更改为[]。

    NSRegularExpression。选项是一个OptionSet,它允许指定零个或多个值。当传递0或大于1时,使用数组文字语法。 见: https://developer.apple.com/reference/swift/optionset

    let ori_str = "abcXabcYabcZ"  // there are 3 Capital character
    let pattern = "[A-Z]"
    let regular = try!NSRegularExpression(pattern: pattern, options: [])
    let results = regular.matches(in: ori_str, options: .reportProgress, range: NSMakeRange(0, ori_str.characters.count))
    print("results have: \(results.count) count")
    

    关于第二个标准,使用正则表达式组将包括:

    let ori_str = "abcXabcYabcZ"  // there are 3 Capital character
    let pattern = "([A-Z])"
    let regular = try!NSRegularExpression(pattern: pattern)
    let replaced = regular.stringByReplacingMatches(
        in: ori_str, options: [],
        range: NSMakeRange(0, ori_str.characters.count),
        withTemplate: "-$1-").lowercased()
    print("Uppercase characters replaced: \(replaced)")
    

    对于更高级的东西,您需要为每个匹配添加额外的自定义代码:

    extension String {
        func replace(regex: NSRegularExpression, with replacer: (_ match:String)->String) -> String {
            let str = self as NSString
            let ret = str.mutableCopy() as! NSMutableString
    
            let matches = regex.matches(in: str as String, options: [], range: NSMakeRange(0, str.length))
            for match in matches.reversed() {
                let original = str.substring(with: match.range)
                let replacement = replacer(original)
                ret.replaceCharacters(in: match.range, with: replacement)
            }
            return ret as String
        }
    }
    
    let ori_str = "abcXabcYabcZ"  // there are 3 Capital character
    let pattern = "[A-Z]"
    let regular = try!NSRegularExpression(pattern: pattern)
    let replaced = ori_str.replace(regex: regular) { "-\($0.lowercased())-" }
    print("Uppercase characters replaced: \(replaced)")