如何在golang中编写简单的正则表达式?

时间:2014-03-09 12:35:04

标签: regex go

我正在尝试编写regexp,它返回以dot开头并直到第一个空格的字符串的子字符串。但我是正则表达式的新手,所以我尝试了一些东西  像这样,它根本不起作用:

package main

import "fmt"
import "regexp"

func main() {
    re := regexp.MustCompile("\\.* ")
    fmt.Printf(re.FindString(".d 1000=11,12")) // Must return d
    fmt.Printf(re.FindString("e 2000=11"))     // Must return nothing or ""
    fmt.Printf(re.FindString(".e2000=11"))     // Must return nothing or ""
}

这段代码只是golang中的白色3个空格。我做错了什么?

2 个答案:

答案 0 :(得分:14)

虽然*是glob匹配中的通配符,但它不是正则表达式中的通配符。在正则表达式中,.是通配符,*表示重复0次或更多次。你可能想要:

re := regexp.MustCompile("\\..* ")

go playground

但你可能会注意到它也会返回点和空​​格。您可以使用FindStringSubmatch并使用捕获组来解决此问题,并且您可以使用后挡板,这样您就不必双重逃避:

re := regexp.MustCompile(`\.(.*) `)
match := re.FindStringSubmatch(".d 1000=11,12")
if len(match) != 0 {fmt.Printf("1. %s\n", match[1])}

go playground

虽然我更喜欢使用\S*(匹配非空格字符)代替.*来获得此匹配,因为它会减少可能的回溯:

re := regexp.MustCompile(`\.(\S*) `)

go playground

答案 1 :(得分:0)

你写的前两个字符\\意味着你正在逃避反斜杠,所以你期望反斜杠作为第一个字符。你应该写^\..*?代替:

  • ^ - 表示开始
  • \。 - 意味着转义点(所以与上面的一个意味着你希望点作为第一个字符)
  • 。*? - 任何字符(点),任意数量的(星号),而不是贪婪(问号)直到空格(空格)

非贪婪意味着它将在第一个空间而不是最后一个空间停止