Как написать простое регулярное выражение в 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
Первые два символа, которые вы пишете \\
, означают, что вы избегаете обратную косую черту, поэтому вы ожидаете обратную косую черту в качестве первого символа. Вы должны написать вместо ^\..*?
:
- ^ - означает начало
- \. - означает выход из точки (так что вместе с одним выше означает, что вы ожидаете точку в качестве первого символа).
- . *? - любой символ (точка), любое число из них (звездочка), а не жадный (знак вопроса) до пробела (пробел)
Нежелательный означает, что он остановится в первом месте, а не на последнем