Дізнайтеся, чи рядок має номер у певній позиції

Чи можна мати рядок, наприклад:

var myText = "AB12CDE"

а потім перевірте, чи є 3-я і 4-я літери цифрами, а якщо не змінити їх на число.

Отже, якщо вищезазначений текст закінчився:

"ABIZCDE" 

Я міг би змінити ІЗ до 12, але не замінюючи всіх екземплярів I і Z, але тільки в 3-му і 4-му чакра.

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
додано
Привіт подякувати вам за цю відповідь він робить сенс, і я працюю в моєму коді. Швидке запитання. Чи буде if indext == 3 || Індекс == 4 - це індекс 2 і 3, оскільки він починається з 0?
додано Автор Tony Merritt, джерело
вибачте, я бачу, що було б правильно, тому що текст, який ви оголосили, як str
додано Автор Tony Merritt, джерело
Я думаю, що ця відповідь, здається, працює краще для мене в моєму обмеженому розумінні і як я кодую. Чи можу я попросити також це замінити charecter в цьому індексі, є спосіб також вставити, а не замінити так сказати 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-й charecters є єдиними, які будуть числами, тому мені потрібна перевірка, яка є специфічною для 3-го і 4-го charecter, щоб перевірити, чи дійсно це число якщо не, я повинен бути в змозі вставити число в нього. На цій позиції
додано Автор 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
додано