有限状态机

例一

去除一个字符串中连续的空格,即"H__el___lo 变成 H_el_lo" ;

就是相当于使用 flag 定义了不同的状态,进行操作

func main() {
	a := "h__el___lo"
	str := []byte(a)
	flag := 1
	for _, v := range str {
		switch flag {
		case 0:
			if v == byte('_') { //还不是字符串

			} else { //是字符串
				fmt.Print(string(v))
				flag = 1
			}
		case 1: //是字符串
			if v == byte('_') { //不是字符串
				fmt.Print(string(v))
				flag = 0
			} else { //还是字符串
				fmt.Print(string(v))
			}
		default:
			fmt.Println("输入有误")
		}
	}
}

//输出结果
h_el_lo

例题二

除连续的空格但字符串中的连续空格不变,比如 h__el__\"wor___ld\"___lo

func main() {
	a := "h__el__\"wor___ld\"___lo"
	str := []byte(a)
	flag1 := 1 //上一个是否是字符串
	flag2 := 0 //是否在”“的里面
	for _, v := range str {
		if v == byte('"') { //修改 flag2 的值
			if flag2 == 0 {
				flag2 = 1
			} else {
				flag2 = 0
			}
		}
		flag3 := (v == '_') //flag3不是字符串
		switch flag1 {
		case 0: //他上一个不是
			switch flag2 {
			case 0: //不在括号里
				if flag3 { //也不是字符串
					continue
				}
				flag1 = 1
				fmt.Print(string(v))
			case 1: //在括号里
				fmt.Print(string(v))
				continue //在括号内的都是原样输出
			default:
				fmt.Println("输出错误")
			}
		case 1: //他的上一个是字符串
			switch flag2 {
			case 0: //不在括号里
				fmt.Print(string(v))
				if flag3 { //不是字符串
					flag1 = 0
				}
			case 1: //在括号里
				fmt.Print(string(v))
			default:
				fmt.Println("输出错误")
			}
		default:
			fmt.Println("输入错误")
		}
	}
}

//输出结果
h_el_"wor___ld"_lo

参考文献

https://blog.csdn.net/zqixiao_09/article/details/50239337

posted @ 2021-07-25 05:07  沧海一声笑rush  阅读(52)  评论(0编辑  收藏  举报