替换字符串中重复的子字符串仅替换其中一个
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。最好使用 rune
s (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()
之后。
以上就是替换字符串中重复的子字符串仅替换其中一个的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341