Saya perlu menghapus angka dari dalam string, tetapi hanya jika angka-angka itu ada di awal kalimat. Saya tidak ingin menghapus angka dalam kalimat. Contohnya:

1Ada 101 dalmatians di ruangan itu. 2 Mereka memiliki 2 orang tua. [baris baru]3 Orang tua itu bernama Pongo dan Perdita.

Dalam teks di atas, saya ingin menghapus angka di awal setiap kalimat, apakah ada spasi setelah angka atau tidak, termasuk jika angka tersebut adalah karakter pertama pada baris baru. Jadi, teks dalam string harus menjadi:

Ada 101 dalmatians di ruangan itu. Mereka memiliki 2 orang tua. [baris baru] Orang tua itu bernama Pongo dan Perdita.

Terima kasih atas bantuan Anda!

1
Sam 4 Januari 2021, 22:12

3 jawaban

Jawaban Terbaik

Anda dapat menghitung kalimat, menggunakan ekspresi reguler untuk memangkas angka utama, dan membuat string akhir.

Misalnya.

let string = """
    1There were 101 dalmatians in the room. 2 They had 2 parents.
    3 The parents were named Pongo and Perdita.
    """

var result: String = ""
string.enumerateSubstrings(in: string.startIndex..., options: .bySentences) { substring, _, _, _ in
    guard
        let trimmed = substring?.replacingOccurrences(of: #"^\d+\s*"#, with: "", options: .regularExpression)
    else { return }
    result.append(trimmed)
}
print(result)

Ada 101 dalmatians di ruangan itu. Mereka memiliki 2 orang tua.
Orang tua itu bernama Pongo dan Perdita.

Ada banyak permutasi pada pola regex. Misalnya. jika Anda menggunakan #"^\d+\.?\)?\s*"#, itu juga akan menangani kasus seperti “1. Ini adalah sebuah ujian!" atau “1) Ini adalah ujian.” Itu hanya tergantung pada variasi apa yang ingin Anda tangani. Tetapi jika Anda hanya mencari angka saja, dengan atau tanpa spasi, maka #"^\d+\s*"# seharusnya baik-baik saja.

2
Rob 4 Januari 2021, 23:25

Berikut ini adalah solusi yang tidak terlalu bagus menggunakan perulangan for dasar untuk menelusuri setiap karakter string dan boolean untuk melacak apakah kita sedang atau tidak memeriksa angka di awal kalimat.

var checkForDigit = true // State of loop
var digitFound = false // Need this to ignore space after digit 
var output = ""
for character in text {
    if character.isPunctuation {
        output.append(character)
        checkForDigit = true
        continue
    }

    if checkForDigit {
        if !character.isNumber {
            if digitFound && character.isWhitespace {
                continue
            }
            output.append(character)
            if !character.isWhitespace {
                checkForDigit = false
            }
        } else {
            digitFound = true
        }
        continue
    }
    digitFound = false
    output.append(character)
}

Saya hanya mengujinya pada contoh dalam pertanyaan sehingga mungkin perlu beberapa penyesuaian

1
Joakim Danielson 4 Januari 2021, 19:56

Hanya untuk bersenang-senang. Anda dapat menghitung kalimat, mendapatkan semua rentang kalimat dan mengganti rentang string asli. Untuk menghapus angka dari awal setiap kalimat Anda dapat menggunakan metode pengumpulan drop(sementara:) dan drop semua karakter non huruf dari substring Anda (kalimat):

extension Bool {
    var negated: Bool { !self }
}

var string = """
1There were 101 dalmatians in the room. 2 They had 2 parents.
3 The parents were named Pongo and Perdita.
"""
var ranges: [Range<String.Index>] = []

string.enumerateSubstrings(in: string.startIndex..., options: .bySentences) { _, range, _, _ in
    ranges.append(range)
}

for range in ranges.reversed() {
    string.replaceSubrange(range, with: string[range].drop(while: \.isLetter.negated))
}

string  // "There were 101 dalmatians in the room. They had 2 parents.\nThe parents were named Pongo and Perdita."
1
Leo Dabus 4 Januari 2021, 21:30