解析特定格式的输入

时间:2015-07-16 06:31:52

标签: regex string parsing go

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

此字符串的格式始终为:
1.以双引号开始 2.后跟字符(可能包含空格)
3.其次是双引号 4.其次是空间
5.接着是" by"
6.其次是空间
7.后跟字符(可能包含空格)

了解上述格式,我该如何阅读?

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

2 个答案:

答案 0 :(得分:5)

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)使用regexp

如果在完成上述所有解决方案后仍然需要使用正则表达式,请按以下步骤操作:

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

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上尝试。

答案 1 :(得分:4)

您应该使用组(括号)来获取所需的信息:

"([\w\s]*)"\sby\s([\w\s]+)\.

这会返回两组:

  1. [1-13] Algorithms 1
  2. [18-34] Robert Sedgewick
  3. 现在应该有一个正则表达式方法来从文本中获取所有匹配项。结果将包含一个匹配对象,然后包含组。

    我认为它是:FindAllStringSubmatch (https://github.com/StefanSchroeder/Golang-Regex-Tutorial/blob/master/01-chapter2.markdown

    在这里测试一下: https://regex101.com/r/cT2sC5/1