Finden Sie heraus, ob eine Zeichenfolge eine Nummer an einer bestimmten Position hat

Ist es möglich, zum Beispiel eine Zeichenfolge zu haben:

var myText = "AB12CDE"

Prüfen Sie dann, ob der 3. und 4. Buchstabe Zahlen sind und wenn nicht, ändern Sie sie in eine Zahl.

Wenn also der obige Text endete:

"ABIZCDE" 

Ich könnte IZ in 12 ändern, aber nicht alle Instanzen von I und Z ersetzen, sondern nur im 3. und 4. Zeichner.

0

6 Antworten

Hier ist es:

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

Zum Einfügen können Sie beispielsweise eine Erweiterung vornehmen:

Fügen Sie dies irgendwo vor Ihrer Klasse hinzu:

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

Dann:

let str2 = "ABC2CDEZ"
var newString = str2.insert(string: "I", index: 3)
print(newString)//ABCI2CDEZ
1
hinzugefügt
Hallo, danke für diese Antwort, es macht Sinn und ich arbeite sie in meinen Code. Eine kurze Frage. Wäre das if indext == 3 || Index == 4 wäre das Index 2 und 3, würde es bei 0 beginnen?
hinzugefügt der Autor Tony Merritt, Quelle
Entschuldigung, ich sehe das wäre richtig wegen des Textes, den Sie als str deklariert haben
hinzugefügt der Autor Tony Merritt, Quelle
Ich denke, diese Antwort scheint mir am besten zu funktionieren, was mein begrenztes Verständnis und meine Codierung angeht. Kann ich auch fragen, dass dies den Charecter an diesem Index ersetzt, gibt es eine Möglichkeit, auch Einfügen statt Ersetzen?
hinzugefügt der Autor Tony Merritt, Quelle
Ja, natürlich können Sie die Indizes nach Belieben ändern.
hinzugefügt der Autor Eridana, Quelle
@ TonyMerritt, ich habe meine Antwort aktualisiert, hoffe das wird helfen :)
hinzugefügt der Autor Eridana, Quelle

Es gibt wahrscheinlich einfachere Alternativen, aber die folgenden werden funktionieren:

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

oder ohne reguläre Ausdrücke:

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)

oder die Logik zusammen bewegen:

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
hinzugefügt

Also habe ich auf dem Spielplatz etwas verspottet, das die gewünschte Wirkung hätte, es hat den zusätzlichen Vorteil, dass man beliebig viele Substitutionsregeln definieren kann:

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
hinzugefügt

Sie können so etwas versuchen:

Suchen Sie zuerst den Teilstring Ihrer Zeichenfolge aus dem Bereich, der an Position 2 und an den nächsten 2 Punkten beginnt, und prüfen Sie dann, ob dies eine Ganzzahl ist. Wenn dies nicht der Fall ist, ersetzen Sie es durch ganze Zahlen.

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)

Ich hoffe es hilft!!

0
hinzugefügt
Ja, es tut uns leid, dass dies möglicherweise nicht vollständig verständlich ist. Wahrscheinlich sind nur der 3. und 4. Charakter die einzigen Zahlen, daher brauche ich einen Check, der für den 3. und 4. Charakter spezifisch ist, um zu überprüfen, ob es tatsächlich eine Zahl und eine Zahl ist Wenn nicht, muss ich in der Lage sein, eine Zahl einzufügen. In dieser Position
hinzugefügt der Autor Tony Merritt, Quelle
@ TonyMerritt Die Antwort wurde geändert. Bitte überprüfen!
hinzugefügt der Autor Agent Smith, Quelle
Dies sollte nur für das erste Auftreten von 12 sorgen. Anscheinend möchte OP den Bereich der zu ersetzenden Zeichen steuern.
hinzugefügt der Autor justintime, Quelle

Hier wird eine vollständige Liste von Zeichen aufgelistet, die Sie möglicherweise durch Alphabete ersetzen möchten. Sie können weitere Zeichen hinzufügen:

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

Funktion, die den Job erledigt:

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
}

Verwendungszweck:

var str = "ABIZCDE"
str.namePlate()//"AB12CDE"
0
hinzugefügt
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)
    }

Sie können es versuchen.

0
hinzugefügt