Как написать простое регулярное выражение в golang?

Я пытаюсь написать regexp, который возвращает подстроку для строки, которая начинается с точки и до первого пробела. Но я новичок в регулярных выражениях, поэтому я попробовал что-то  так и не работает вообще:

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 ""
}

этот код просто белый 3 пробела в голанге. Что я делаю неправильно?

Ответ 1

Пока * является подстановочным знаком в сопоставлении 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

Ответ 2

Первые два символа, которые вы пишете \\, означают, что вы избегаете обратную косую черту, поэтому вы ожидаете обратную косую черту в качестве первого символа. Вы должны написать вместо ^\..*?:

  • ^ - означает начало
  • \. - означает выход из точки (так что вместе с одним выше означает, что вы ожидаете точку в качестве первого символа).
  • . *? - любой символ (точка), любое число из них (звездочка), а не жадный (знак вопроса) до пробела (пробел)

Нежелательный означает, что он остановится в первом месте, а не на последнем