gpt4 book ai didi

regex - 解析特定格式的输入

转载 作者:IT王子 更新时间:2023-10-29 01:18:30 24 4
gpt4 key购买 nike

假设我有以下字符串:"Algorithms 1"by Robert Sedgewick。这是从终端输入的。

这个字符串的格式永远是:
1. 以双引号开头
2. 后跟字符(可包含空格)
3.后面加双引号
4.后跟空格
5.后面跟着“by”字
6.后跟空格
7.后跟字符(可能包含空格)

知道上面的格式,我怎么读这个?

我尝试使用 fmt.Scanf() 但这会将每个空格后的单词视为一个单独的值。我查看了正则表达式,但我无法确定是否有一个函数可以用来获取值而不仅仅是测试有效性。

最佳答案

1) 使用字符搜索

输入格式非常简单,您可以简单地使用 strings.IndexRune() 中实现的字符搜索:

s := `"Algorithms 1" by Robert Sedgewick`

s = s[1:] // Exclude first double qote
x := strings.IndexRune(s, '"') // Find the 2nd double quote
title := s[:x] // Title is between the 2 double qotes
author := s[x+5:] // Which is followed by " by ", exclude that, rest is author

打印结果:

fmt.Println("Title:", title)
fmt.Println("Author:", author)

输出:

Title: Algorithms 1
Author: Robert Sedgewick

Go Playground 上试试.

2) 拆分

另一种解决方案是使用 strings.Split() :

s := `"Algorithms 1" by Robert Sedgewick`

parts := strings.Split(s, `"`)
title := parts[1] // First part is empty, 2nd is title
author := parts[2][4:] // 3rd is author, but cut off " by "

输出是一样的。在 Go Playground 上试用.

3) 使用“棘手的”拆分

如果我们切断第一个双引号,我们可以通过分隔符进行分割

`" by `

如果我们这样做,我们将有两部分:标题和作者。由于我们切断了第一个双引号,分隔符只能在标题的末尾(根据您的规则,标题不能包含双引号):

s := `"Algorithms 1" by Robert Sedgewick`

parts := strings.Split(s[1:], `" by `)
title := parts[0] // First part is exactly the title
author := parts[1] // 2nd part is exactly the author

Go Playground 上试试.

4) 使用正则表达式

如果在所有上述解决方案之后您仍然想使用正则表达式,那么您可以这样做:

使用圆括号来定义你想要退出的子匹配。您需要 2 个部分:引号之间的标题和 by 之后的作者。您可以使用 regexp.FindStringSubmatch()得到匹配的部分。请注意,返回的 slice 中的第一个元素将是完整的输入,因此相关部分是后续元素:

s := `"Algorithms 1" by Robert Sedgewick`

r := regexp.MustCompile(`"([^"]*)" by (.*)`)
parts := r.FindStringSubmatch(s)
title := parts[1] // First part is always the complete input, 2nd part is the title
author := parts[2] // 3rd part is exactly the author

Go Playground 上试试.

关于regex - 解析特定格式的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31446796/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com