卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章34627本站已运行393

替换字符串中重复的子字符串仅替换其中一个

替换字符串中重复的子字符串仅替换其中一个

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() 之后。

卓越飞翔博客
上一篇: 将DATE类型的sql字段扫描到go struct字段中
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏