Maison  >  Article  >  développement back-end  >  Remplacez les sous-chaînes répétées dans une chaîne en remplaçant une seule d'entre elles

Remplacez les sous-chaînes répétées dans une chaîne en remplaçant une seule d'entre elles

PHPz
PHPzavant
2024-02-09 08:15:291009parcourir

Remplacez les sous-chaînes répétées dans une chaîne en remplaçant une seule dentre elles

L'éditeur php Yuezi remplace les sous-chaînes répétées dans une chaîne. C'est un problème courant de n'en remplacer qu'une seule. Dans le traitement des chaînes, nous devons parfois remplacer des sous-chaînes répétées dans une chaîne, mais nous ne voulons pas remplacer toutes les sous-chaînes répétées, mais une seule d'entre elles. Cela peut conserver d'autres sous-chaînes identiques tout en obtenant l'effet de remplacement souhaité. En PHP, nous pouvons répondre à cette exigence à l’aide de certaines fonctions et expressions régulières intégrées. Ci-dessous, nous présenterons en détail comment implémenter la méthode consistant à remplacer une seule des sous-chaînes répétées dans la chaîne.

Contenu de la question

Je crée un simple jeu du pendu avec go mais je rencontre un bug où la chaîne inconnue_string (qui sera affichée dans le code) a le caractère _ afin que les autres joueurs devinant les lettres puissent voir le longueur du mot, chaque fois que le joueur entre la bonne lettre, je veux qu'il remplace le nième (n dépend de l'index où se trouve la lettre dans le mot) _ caractère par cette lettre, cela a réussi, mais il y a un problème. Si un mot comporte deux lettres répétées, une seule d’entre elles est remplacée.

J'ai créé une fonction distincte appelée iterate (cette fonction a été créée parce que je voulais éviter le code imbriqué) pour parcourir tous les index. Mais ça ne marche pas, le code est le suivant :

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

Solution

Comparaison if change_unknown_word_string[i] == change_unknown_word_string[index] 没有任何意义,因为 unknown_word_string 显然在这些位置包含 _.

Vous devriez comparer word[i] == input[0] en boucle.

Mais attention, ajoutez des string 转换为 byte 数组不支持 unicode。最好使用 rune (points de code Unicode) pour ne plus être limité aux caractères 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. Cette comparaison est fausse

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

Ça devrait être ifunknown_word_string == word 并位于调用 iterate()après.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer