Узнайте, есть ли у последовательности число в определенном положении

Он возможный иметь последовательность, например:

var myText = "AB12CDE"

и затем проверьте, чтобы видеть, являются ли 3-и и 4-е письма числами и если не изменяют его на число.

Таким образом, если вышеупомянутый текст закончил тем, что был:

"ABIZCDE" 

Я был бы в состоянии изменить IZ на 12, но не заменяющий все случаи меня и Z, но только в 3-м и 4-м charecther.

0

6 ответы

Вот это:

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
1
добавлено
Привет спасибо за этот ответ, который это делает с тех пор и я работаю он в свой код. Быстрый вопрос. Был бы, если indext == 3 || индекс == 4, который будет индексом 2 и 3, потому что это началось бы в 0?
добавлено автор Tony Merritt, источник
жаль я вижу, что это было бы правильно из-за текста, который вы объявили как str
добавлено автор Tony Merritt, источник
Я думаю, что этот ответ, кажется, работает лучше всего на меня в моем ограниченном понимании и как я кодирую. Я могу спросить, чтобы также это заменило характер в том индексе, есть ли способ также Вставить, а не заменить, так скажите id, которым это было 12, но кулак назад как только 2 я мог вставить 1 в положение и выдвинуть остальных вперед?
добавлено автор Tony Merritt, источник
Да, курс, вы могли изменить индексы, как вы хотите.
добавлено автор Eridana, источник
@TonyMerritt, я обновил свой ответ, надежда, которой это поможет:)
добавлено автор Eridana, источник

Есть, вероятно, более простые альтернативы, но следующее будет работать:

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
    }
})
0
добавлено

Таким образом, я копировал что-то в детской площадке, которая будет иметь желаемый эффект, она обладает дополнительным преимуществом способности определить любое количество правил замены:

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)
0
добавлено

Можно попробовать что-то вроде этого:

Во-первых, найдите подстроку своей последовательности из диапазона, начинающегося в местоположении 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)

Надежда это помогает!!

0
добавлено
Да, жаль это может быть не полностью понятно, больше, чем, вероятно, 3-и и 4-е знаки - единственные, которые будут числами, таким образом, мне будет нужна проверка, которая характерна для 3-го и 4-го характера, чтобы проверить, является ли это на самом деле число и если не я должен быть в состоянии вставить число в него. В том положении
добавлено автор Tony Merritt, источник
@TonyMerritt Изменил ответ. Пожалуйста, проверьте!
добавлено автор Agent Smith, источник
Это должно только заботиться о первом происшествии 12 . Кажется, что OP хотел бы управлять рядом персонажей, чтобы заменить.
добавлено автор justintime, источник

Это перечисляет исчерпывающий список знаков, которые вы могли бы хотеть заменить алфавитами, можно добавить больше к ним:

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"
0
добавлено
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)
    }

Можно попробовать это.

0
добавлено