首頁  >  文章  >  後端開發  >  替換字串中重複的子字串僅替換其中一個

替換字串中重複的子字串僅替換其中一個

PHPz
PHPz轉載
2024-02-09 08:15:29970瀏覽

替換字串中重複的子字串僅替換其中一個

php小編柚子替換字串中重複的子字串僅替換其中一個是常見的問題。在字串處理中,有時候我們需要將字串中重複出現的子字串進行替換,但是我們又不想替換所有的重複子字串,而是只替換其中一個。這樣可以保留其他相同的子字串,同時達到我們想要的替換效果。在php中,我們可以藉助一些內建函數和正規表示式來實現這個需求。下面,我們將詳細介紹如何實作替換字串中重複的子字串僅替換其中一個的方法。

問題內容

我正在用go 製作一個簡單的劊子手遊戲,但我遇到了一個錯誤,unknow_string 字符串(將在代碼中顯示)有_ 字符,因此猜測字母的其他玩家可以看到單字的長度,每當玩家輸入正確的字母時,我希望它用該字母替換第n 個(n 取決於該字母在單字中找到的索引)_ 字符,這已經成功,但有一個問題。如果單字有兩個重複字母,則僅替換其中一個。

我建立了一個名為 iterate 的單獨函數(該函數是因為我想避免巢狀程式碼),以迭代所有索引。但它不起作用,程式碼如下:

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)
}

解決方法

比較if change_unknown_word_string[i] == change_unknown_word_string[index] 沒有任何意義,因為unknown_word_string#_

您應該在循環中比較 word[i] == input[0]

但請注意,將 string 轉換為 byte 陣列不支援 unicode。最好使用 runes (unicode 代碼點),這樣您就不再局限於 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)
}

附註:這種比較是錯誤的

if unknown_word_string == input {
            fmt.Println("Player 1 lost! Player 2 guessed the word by guessing the letter!")
        }

它應該是 ifunknown_word_string == word 並且位於呼叫 iterate() 之後。

以上是替換字串中重複的子字串僅替換其中一個的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除