Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/114.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何创建正则表达式来查找字符串中的重复字符?_Ios_Swift - Fatal编程技术网

Ios 如何创建正则表达式来查找字符串中的重复字符?

Ios 如何创建正则表达式来查找字符串中的重复字符?,ios,swift,Ios,Swift,例如: HelloWorld-重复字符为5(l重复3次,o重复2次) Smart2000,重复字符=3?(0重复3次) Smart@200@12,重复字符=6 我试着对字符串进行迭代 下面是我的代码,通过字符串迭代来找出字符串中的重复字符 func countRepeatDigitsIn(keyword : String) -> Int { // To keep track of processed symbols var uniqueCharacters = ""

例如:

  • HelloWorld-重复字符为5(l重复3次,o重复2次)
  • Smart2000,重复字符=3?(0重复3次)
  • Smart@200@12,重复字符=6
  • 我试着对字符串进行迭代

    下面是我的代码,通过字符串迭代来找出字符串中的重复字符

    func countRepeatDigitsIn(keyword : String) -> Int
    {
        // To keep track of processed symbols
        var uniqueCharacters = ""
        var repeatCharacterCount = 0
    
        for char in keyword.uppercased() {
            let alphabet = String(char)
    
            // If this is already counted, skip it
            if (uniqueCharacters.contains(alphabet))
            {
                repeatCharacterCount += 1
            }
    
            // Otherwise, add it to processed symbols
            uniqueCharacters += alphabet
        }
    
        return repeatCharacterCount
    }
    
    HelloWorld-重复字符为5(l重复3次,o重复2次

    获得该结果的最简单方法是获取直方图,然后将所有非1的值相加

    例如:

    func histogram(_ s:String) -> [Character:Int] {
        var d = [Character:Int]()
        for c in s {
            d[c, default:0] += 1
        }
        return d
    }
    let reps = histogram("helloworld").values.filter{$0 > 1}.reduce(0, +) // 5
    let reps2 = histogram("smart2000").values.filter{$0 > 1}.reduce(0, +) // 3
    let reps3 = histogram("Smart@200@12").values.filter{$0 > 1}.reduce(0, +) // 6
    

    下面是一个有趣的字符串字符缩减和筛选链

    func countRepeatDigitsIn(keyword : String) -> Int {
        let total = Array(keyword.uppercased()).reduce(into: [Character : Int]()) { $0[$1, default: 0] += 1 }.filter { $0.value > 1 }.reduce(0) { $0 + $1.value }
    
        return total
    }
    
    for text in ["HelloWorld", "Smart2000", "Smart@200@12"] {
        print(text, countRepeatDigitsIn(keyword: text))
    }
    

    第一种方法是
    reduce
    构建一个字典,其中键是字符,值是字符的计数。然后过滤器只删除一次找到的字符。第二种方法是添加剩余的计数。

    使用对字典中的相同字符进行分组,并添加计数大于1的值的计数

    extension String {
        func repeatCount() -> Int {
            return Dictionary(grouping: lowercased()) { $0 }.values.filter { $0.count > 1 }.reduce(0) { $0 + $1.count }
        }
    }
    print("HelloWorLd".repeatCount())//5
    print("Smart2000".repeatCount())//3
    print("Smart@200@12".repeatCount())//6
    

    正则表达式不是您想要的。不要通过事先确定正则表达式是最好的来预先判断最佳方法。只需问您的问题并显示一些代码。+1是解决方案。直接在字符计数字典上使用
    reduce
    作为
    直方图(“helloworld”)。reduce(0,{$0+($1.value>1?$1.value:0)})