ホームページ  >  記事  >  バックエンド開発  >  文字列内で繰り返される部分文字列のうち 1 つだけを置換して置換します。

文字列内で繰り返される部分文字列のうち 1 つだけを置換して置換します。

PHPz
PHPz転載
2024-02-09 08:15:291009ブラウズ

文字列内で繰り返される部分文字列のうち 1 つだけを置換して置換します。

php Xiaobian Yuezi は、文字列内の繰り返し部分文字列を置換し、そのうち 1 つだけを置換します。これはよくある問題です。文字列処理では、文字列内の繰り返し部分文字列を置換する必要がある場合がありますが、繰り返し部分文字列をすべて置換するのではなく、そのうちの 1 つだけを置換したいと考えます。これにより、必要な置換効果を実現しながら、他の同一の部分文字列を保持できます。 PHP では、いくつかの組み込み関数と正規表現を利用してこの要件を達成できます。以下では、文字列内の繰り返し部分文字列のうち 1 つだけを置換する方法の実装方法を詳しく紹介します。

質問内容

goを使って簡単な死刑執行人ゲームを作っているのですが、エラーが発生しました。unknown_stringという文字列(コード内に表示されます)に_文字が含まれているので、その文字を推測してください。他のプレイヤーは単語の長さを確認でき、プレイヤーが正しい文字を入力するたびに、n 番目 (n は単語内で文字が見つかるインデックスに依存します) _ 文字をその文字に置き換えたいと考えています。成功しましたが、一つ疑問があります。単語に 2 つの文字が繰り返されている場合、そのうちの 1 つだけが置き換えられます。

すべてのインデックスを反復処理するために、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)
}

回避策

比較ifchange_unknown_word_string[i] ==change_unknown_word_string[index] は明らかに unknown_word_string が含まれているため意味がありません。これらの位置は #__ です。

ループ内で

word[i] == input[0] を比較する必要があります。

ただし、

string から byte 配列への変換は Unicode をサポートしていないことに注意してください。 latin1 文字に制限されないよう、rune (Unicode コード ポイント) を使用することをお勧めします。 リーリー

注: この比較は間違っています

リーリー

これは

ifunknown_word_string == word であり、iterate() の呼び出しの後に来る必要があります。

以上が文字列内で繰り返される部分文字列のうち 1 つだけを置換して置換します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。