Rumah > Artikel > pembangunan bahagian belakang > Gantikan subrentetan berulang dalam rentetan dengan menggantikan hanya satu daripadanya
editor php Yuezi menggantikan subrentetan berulang dalam rentetan Adalah masalah biasa untuk menggantikan salah satu daripadanya. Dalam pemprosesan rentetan, kadangkala kita perlu menggantikan subrentetan berulang dalam rentetan, tetapi kita tidak mahu menggantikan semua subrentetan berulang, tetapi hanya satu daripadanya. Ini boleh mengekalkan subrentetan lain yang serupa sambil mencapai kesan penggantian yang kita inginkan. Dalam PHP, kita boleh mencapai keperluan ini dengan bantuan beberapa fungsi terbina dalam dan ungkapan biasa. Di bawah, kami akan memperkenalkan secara terperinci bagaimana untuk melaksanakan kaedah menggantikan hanya satu daripada subrentetan berulang dalam rentetan.
Saya sedang membuat permainan algojo yang mudah dengan go tetapi saya menghadapi pepijat di mana rentetan unknown_string (yang akan ditunjukkan dalam kod) mempunyai aksara _ jadi pemain lain yang meneka huruf itu boleh melihat panjang perkataan , setiap kali pemain memasukkan huruf yang betul, saya mahu ia menggantikan nth (n bergantung pada indeks di mana huruf itu ditemui dalam perkataan) _ watak dengan huruf itu, ini telah berjaya, tetapi terdapat masalah. Jika perkataan mempunyai dua huruf berulang, hanya satu daripadanya diganti.
Saya mencipta fungsi berasingan yang dipanggil iterate (fungsi ini dicipta kerana saya ingin mengelakkan kod bersarang) untuk melelaran ke atas semua indeks. Tetapi ia tidak berfungsi, kodnya adalah seperti berikut:
package main import ( "fmt" "strings" ) var input string var word string var unknown_word []string var unknown_word_string string var index int var guesses int var change_unknown_word_string []byte func main() { fmt.Println("Welcome to hangman") fmt.Println("Player 1, choose a word!") fmt.Scan(&word) for i := 1; i <= len(word); i++ { unknown_word = append(unknown_word, "_") } unknown_word_string = strings.Join(unknown_word, "") for { fmt.Println("Player 2, guess a letter or a word") fmt.Println(unknown_word_string) fmt.Scan(&input) if guesses == 6 { fmt.Println("Player 2 lost! Player 1's word was: ", word) break } else if unknown_word_string == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!") } if strings.Contains(word, input) && word != input { index = strings.Index(word, input) iterate() fmt.Println("You guessed a letter!") } else if word == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the whole word!") break } else { fmt.Println("Nothing found") guesses++ } } } func iterate() { change_unknown_word_string = []byte(unknown_word_string) for i := 0; i < len(change_unknown_word_string); i++ { if change_unknown_word_string[i] == change_unknown_word_string[index] { change_unknown_word_string[i] = []byte(input)[0] } } unknown_word_string = string(change_unknown_word_string) }
Perbandingan if change_unknown_word_string[i] == change_unknown_word_string[index]
没有任何意义,因为 unknown_word_string
显然在这些位置包含 _
.
Anda harus membandingkan word[i] == input[0]
dalam satu gelung.
Tetapi ambil perhatian, tambah string
转换为 byte
数组不支持 unicode。最好使用 rune
s (titik kod unikod) supaya anda tidak lagi terhad kepada aksara latin1.
func iterate() { needle := []rune(input)[0] haystack := []rune(word) buf := []rune(unknown_word_string) for i := range haystack { if haystack[i] == needle { buf[i] = needle } } unknown_word_string = string(buf) }
P.S. Perbandingan ini salah
if unknown_word_string == input { fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!") }
Sepatutnya ifunknown_word_string == word
并位于调用 iterate()
selepas.
Atas ialah kandungan terperinci Gantikan subrentetan berulang dalam rentetan dengan menggantikan hanya satu daripadanya. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!