【发布时间】:2018-08-02 12:36:40
【问题描述】:
是否可以有一个字符串例如:
var myText = "AB12CDE"
然后检查第 3 和第 4 个字母是否为数字,如果不是则将其更改为数字。
所以如果上面的文字最终是:
"ABIZCDE"
我可以将 IZ 更改为 12,但不能替换 I 和 Z 的所有实例,而只能替换第 3 和第 4 个字符。
【问题讨论】:
标签: swift replace numbers letters
是否可以有一个字符串例如:
var myText = "AB12CDE"
然后检查第 3 和第 4 个字母是否为数字,如果不是则将其更改为数字。
所以如果上面的文字最终是:
"ABIZCDE"
我可以将 IZ 更改为 12,但不能替换 I 和 Z 的所有实例,而只能替换第 3 和第 4 个字符。
【问题讨论】:
标签: swift replace numbers letters
这里是:
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
【讨论】:
你可以试试这样的:
首先,从位置 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 想控制要替换的字符的范围。
可能有更简单的替代方案,但以下方法可行:
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
}
})
【讨论】:
这列举了一个详尽的字符列表,您可能希望用字母替换,您可以在其中添加更多:
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"
【讨论】:
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)
}
你可以试试这个。
【讨论】:
所以我在操场上模拟了一些会产生预期效果的东西,它还有一个额外的好处是能够定义任意数量的替换规则:
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)
【讨论】: