【问题标题】:Find out if a string has a number in a specific position找出字符串是否在特定位置有数字
【发布时间】:2018-08-02 12:36:40
【问题描述】:

是否可以有一个字符串例如:

var myText = "AB12CDE"

然后检查第 3 和第 4 个字母是否为数字,如果不是则将其更改为数字。

所以如果上面的文字最终是:

"ABIZCDE" 

我可以将 IZ 更改为 12,但不能替换 I 和 Z 的所有实例,而只能替换第 3 和第 4 个字符。

【问题讨论】:

    标签: swift replace numbers letters


    【解决方案1】:

    这里是:

    let str = "ABCIZCDEZ"
    var newString = ""
    var index = 0
    str.forEach { (char) in            
        var charToAppend = char
        if index == 3 || index == 4 {
            if char == "Z" {
                charToAppend = "2"
            }
            if char == "I" {
                charToAppend = "1"
            }
        }
        newString.append(charToAppend)
        index += 1
    }
    
    print(newString) // ABC12CDEZ
    

    例如,对于插入,您可以进行扩展:

    在你上课前的某处添加这个:

    public extension String {
        public func insert(string: String, index: Int) -> String {
            return String(self.prefix(index)) + string + String(self.suffix(self.count - index))
        }
    }
    

    然后:

    let str2 = "ABC2CDEZ"
    var newString = str2.insert(string: "I", index: 3)
    print(newString) // ABCI2CDEZ
    

    【讨论】:

    • 您好,感谢您的回复,这是有道理的,我正在将其纳入我的代码中。一个快速的问题。 if indext == 3 || Index == 4 那会是索引 2 和 3,因为它会从 0 开始吗​​?
    • 抱歉,我认为这是正确的,因为您声明为 str 的文本
    • 我认为这个答案在我有限的理解和我的编码方式中似乎最适合我。我还可以问一下,这正在替换该索引处的字符,有没有办法也插入而不是替换,所以说 id 它是 12 但由于只有 2 我可以将 1 插入该位置并推动其余部分,所以会返回?跨度>
    • @TonyMerritt,我更新了我的答案,希望这会有所帮助:)
    【解决方案2】:

    你可以试试这样的:

    首先,从位置 2 到下一个 2 点的范围内找到字符串的子字符串,然后检查它是否是整数。如果没有,则将其替换为整数。

    var myText = "ABIZCDE"
    
            let myNSString = myText as NSString
            let subString = myNSString.substring(with: NSRange(location: 2, length: 2))
    
            print(subString)
    
            let isInt = Int(subString) != nil
            if !isInt {
                myNSString.replacingCharacters(in: NSRange(location: 2, length: 2), with: "12")
            }
    
            print(myNSString)
    

    希望对你有帮助!

    【讨论】:

    • 这应该只处理12的第一次出现。似乎 OP 想控制要替换的字符的范围。
    • 是的,抱歉,它可能无法完全理解,很可能第三和第四个字符是唯一的数字,所以我需要一个特定于第三个和第四个字符的检查检查它是否实际上是一个数字,如果不是,我需要能够在其中插入一个数字。在那个位置
    • @TonyMerritt 更改了答案。请检查!
    【解决方案3】:

    可能有更简单的替代方案,但以下方法可行:

    let myText = "ABIZCDEIZIZ"
    
    let result = myText
        // replace any I at 3rd or 4th position with 1
        .replacingOccurrences(of: "(?<=^.{2,3})I", with: "1", options: .regularExpression)
        // replace any Z at 3rd or 4th position with 2
        .replacingOccurrences(of: "(?<=^.{2,3})Z", with: "2", options: .regularExpression)
    print(result) // AB12CDEIZIZ
    

    或者,没有正则表达式:

    let result = String(myText.enumerated().map {
        guard (2...3).contains($0.offset) else { return $0.element }
    
        switch $0.element {
        case "I":
            return "1"
        case "Z":
            return "2"
        default:
            return $0.element
        }
    })
    
    print(result)
    

    或将逻辑一起移动:

    let result = String(myText.enumerated().map {
        switch $0.element {
        case "I" where (2...3).contains($0.offset):
            return "1"
        case "Z" where (2...3).contains($0.offset):
            return "2"
        default:
            return $0.element
        }
    })
    

    【讨论】:

      【解决方案4】:

      这列举了一个详尽的字符列表,您可能希望用字母替换,您可以在其中添加更多:

      extension Character {
          var alpabetNumber: Character? {
              switch self {
              case "I":
                  return "1"
              case "Z":
                  return "2"
              default:
                  return nil
              }
          }
      }
      

      完成这项工作的功能:

      extension String {
          mutating func namePlate() -> String {
              var index = 0
              self.forEach { (char) in
                  if index == 2 || index == 3 {
                      if let replacement = char.alpabetNumber {
                          self = replace(self, index, replacement)
                      }
                  }
                  index += 1
              }
              return self
          }
      }
      
      // Helper
      func replace(_ myString: String, _ index: Int, _ newChar: Character) -> String {
          var modifiedString = String()
          for (i, char) in myString.enumerated() {
              modifiedString += String((i == index) ? newChar : char)
          }
          return modifiedString
      }
      

      用法:

      var str = "ABIZCDE"
      str.namePlate() // "AB12CDE"
      

      【讨论】:

        【解决方案5】:
        var str = "AB12CDE"
            let index1 = str.index (str.startIndex, offsetBy: 2)
            let index2 = str.index (str.startIndex, offsetBy: 3)
            print(str[index1],str[index2])
            if str[index1] == "1" && str[index2] == "2" {
                let newString = str.prefix(2) + "IZ" + str.dropFirst(5)
                print(newString)
            }
        

        你可以试试这个。

        【讨论】:

          【解决方案6】:

          所以我在操场上模拟了一些会产生预期效果的东西,它还有一个额外的好处是能够定义任意数量的替换规则:

          import Foundation
          
          struct Substitution {
          
              var origin: String
              var result: String
              var targetIndices: [Int]
          }
          
          let subs = [
              Substitution(origin: "1", result: "I", targetIndices:[2, 3]),
              Substitution(origin: "2", result: "Z", targetIndices:[2, 3])
          ]
          
          let charset = CharacterSet(charactersIn: subs.map({ $0.origin }).joined(separator: ""))
          
          let input = "AB12CDE"
          
          func process(_ input: String) -> String {
          
              var output = input
          
              for (index, character) in input.enumerated() {
                  if let sub = subs.first(where: { $0.targetIndices.contains(index) && $0.origin == String(character) }) {
                      output = (output as NSString).replacingCharacters(in: NSMakeRange(index, 1), with: sub.result)
                  }
              }
          
              return output
          }
          
          let output = process(input)
          

          【讨论】:

            猜你喜欢
            • 2014-01-29
            • 1970-01-01
            • 2014-11-24
            • 1970-01-01
            • 2022-01-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多