MST

星途 面试题库

面试题:Go字符串解析中处理特殊字符的技巧

假设需要解析一个包含特殊字符(如转义字符`\`、换行符`\n`等)的字符串,并且要准确识别这些特殊字符的含义,在Go语言中该如何实现?请编写一个函数,输入这样的字符串,输出解析后的内容,同时要考虑效率和代码的简洁性。
30.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "strconv"
    "strings"
)

func parseSpecialStr(s string) string {
    var result strings.Builder
    i := 0
    for i < len(s) {
        if s[i] == '\\' {
            if i+1 < len(s) {
                switch s[i+1] {
                case 'n':
                    result.WriteRune('\n')
                case 't':
                    result.WriteRune('\t')
                case '\\':
                    result.WriteRune('\\')
                // 可以继续添加其他转义字符的处理
                default:
                    // 处理八进制转义字符 \ooo(o 为八进制数字)
                    if '0' <= s[i+1] && s[i+1] <= '7' {
                        num := 0
                        count := 0
                        for ; i+1 < len(s) && '0' <= s[i+1] && s[i+1] <= '7' && count < 3; i, count = i+1, count+1 {
                            num = num*8 + int(s[i+1]-'0')
                        }
                        i--
                        result.WriteRune(rune(num))
                    } else if s[i+1] == 'x' && i+3 < len(s) {
                        // 处理十六进制转义字符 \xhh(h 为十六进制数字)
                        num, err := strconv.ParseInt(s[i+2:i+4], 16, 32)
                        if err == nil {
                            result.WriteRune(rune(num))
                            i += 3
                        }
                    } else {
                        result.WriteRune(s[i+1])
                    }
                }
                i++
            }
        } else {
            result.WriteByte(s[i])
        }
        i++
    }
    return result.String()
}

你可以使用以下方式调用这个函数:

func main() {
    testStr := "Hello\\nWorld\\t\\x41\\101"
    fmt.Println(parseSpecialStr(testStr))
}

代码说明

  1. 字符串解析循环:通过一个 for 循环遍历输入字符串 s
  2. 转义字符处理:当遇到 \ 字符时,检查下一个字符,根据不同的转义字符(如 \n\t\\ 等)进行相应处理。
  3. 八进制和十六进制转义字符处理:对于八进制转义字符 \ooo 和十六进制转义字符 \xhh 也进行了解析处理。
  4. 非转义字符处理:如果当前字符不是 \,直接将其写入结果字符串。
  5. 使用 strings.Builder:为了提高效率,使用 strings.Builder 来构建结果字符串,避免在循环中频繁的字符串拼接操作。