Bir qatorda ma'lum bir pozitsiyada raqam mavjudligini bilib oling

Misol uchun, masalan, mag'lubiyatga ega bo'lish mumkinmi?

var myText = "AB12CDE"

va keyin 3 va 4-harflarning son ekanligini tekshiring va uni raqamga o'zgartirmang.

Shunday qilib, agar yuqorida ko'rsatilgan matn oxiriga etkazilsa:

"ABIZCDE" 

IZ ni 12 ga o'zgartirishi mumkin, lekin I va Z ning barcha nusxalarini o'zgartirmasdan, faqat 3 va 4-chi darajalarda.

0

6 javoblar

Mana shu:

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

Masalan, qo'shilish uchun siz kengaytmalarni yaratishingiz mumkin:

Buni sinfingizdan oldin bir joyga qo'shing:

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

Keyin:

let str2 = "ABC2CDEZ"
var newString = str2.insert(string: "I", index: 3)
print(newString)//ABCI2CDEZ
1
qo'shib qo'ydi
Ushbu javob uchun minnatdorchilik bildiraman, bu mening fikrimcha va men uni kodimga ishlayapman. Tez savol. Agar indeks == 3 || Indeks == 4 indeks 2 va 3 bo'lishi mumkin, chunki u 0 dan boshlanadi?
qo'shib qo'ydi muallif Tony Merritt, manba
Kechirasiz, chunki siz str sifatida e'lon qilingan matn tufayli to'g'ri bo'lar edi
qo'shib qo'ydi muallif Tony Merritt, manba
Menimcha, bu javob mening cheklangan tushunishda va kodlash usulida men uchun eng yaxshi ish bo'lgan ko'rinadi. Bundan tashqari, ushbu indeksdagi xodimi o'rnini almashtirishni so'rashi mumkinmi, buning o'rniga "Insert" o'rniga "12" deb nom berish o'rniga 12 marta takrorlash kerakmi?
qo'shib qo'ydi muallif Tony Merritt, manba
Ha, albatta, indekslarni kerakli darajada o'zgartirishi mumkin.
qo'shib qo'ydi muallif Eridana, manba
@TonyMerritt, javobni yangiladim, umid qilamanki :)
qo'shib qo'ydi muallif Eridana, manba

Ehtimol, oddiy alternativa bor, lekin quyidagi ishlaydi:

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

yoki oddiy so'zlarsiz:

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)

yoki mantiqni birgalikda harakatlantirish:

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
qo'shib qo'ydi

Shuning uchun o'yin maydonchasida kerakli effektga ega bo'lgan narsalarni masxara qildim, u erda har qanday o'zgarish qoidalarini belgilashning qo'shimcha foydasi bor:

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
qo'shib qo'ydi

Siz shunday bir narsani sinashingiz mumkin:

Birinchidan, 2 va 2 nuqtalaridan boshlab boshlangan qatordan pastki chiziqni toping, keyin u butunlikni tekshiring. agar u butun sonlarni o'zgartirmasa.

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)

Umid qilamanki!

0
qo'shib qo'ydi
Ha, afsuski, to'liq va tushunarli bo'lishi mumkin emas, balki uchinchi va to'rtinchi xodisalar soni bo'lishi mumkin bo'lgan yagona narsa bo'lishi mumkin, shuning uchun uchinchi va to'rtinchi xarakterga maxsus tekshirishga ehtiyoj bor; agar unda raqamni kiritish imkoni bo'lmasa. Bu holatda
qo'shib qo'ydi muallif Tony Merritt, manba
@TonyMerritt Javobni o'zgartirdi. Iltimos, tekshiring!
qo'shib qo'ydi muallif Agent Smith, manba
Bu faqat 12 ning birinchi paydo bo'lishiga e'tibor berish kerak. O'zgartirishga mo'ljallangan belgilar oralig'ini nazorat qilmoqchi bo'lgan OB kabi ko'rinadi.
qo'shib qo'ydi muallif justintime, manba

Bu alifbo bilan almashtirishni xohlagan belgilarning to'liq ro'yxatini keltirib chiqaradi, bunga qo'shimcha qilib quyidagilarni qo'shishingiz mumkin:

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

Ishni bajaradigan funksiya:

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
}

Foydalanish:

var str = "ABIZCDE"
str.namePlate()//"AB12CDE"
0
qo'shib qo'ydi
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)
    }

Buni sinashingiz mumkin.

0
qo'shib qo'ydi