У меня есть небольшой скрипт PHP, который проходит через мой журнал apache — и я пытаюсь преобразовать этот скрипт в Go. Однако у меня возникают трудности с поиском хорошего эквивалента функции PHP preg_match
,
В моем PHP-скрипте я запускаю preg_match
на каждой строке в файле журнала, как это:
preg_match('/([.0-9]+) .*?\[([0-9a-zA-Z:\/+ ]+)\].*?"[A-Z]+ \/([^\/ ]+)\/([a-zA-Z0-9\-.]+).*" ([0-9]{3}) .*"(.*?)"$/', $line, $matches)
Выполнение этого выражения в этом журнале:
100.100.100.100 — — [23 / фев / 2015: 03: 03: 56 +0100] «GET /folder/file.mp3 HTTP / 1.1» 206 5637064 «-» «AppleCoreMedia / 1.0.0.12B466 (iPhone; U; ЦП OS 8_1_3, как Mac OS X; da_dk) »
Возвращает следующий массив (где меня действительно интересует только [1-6]:
Array
(
[0] => 100.100.100.100 - - [23/Feb/2015:03:03:56 +0100] "GET /folder/file.mp3 HTTP/1.1" 206 5637064 "-" "AppleCoreMedia/1.0.0.12B466 (iPhone; U; CPU OS 8_1_3 like Mac OS X; da_dk)"[1] => 100.100.100.100
[2] => 23/Feb/2015:03:03:56 +0100
[3] => folder
[4] => file.mp3
[5] => 206
[6] => AppleCoreMedia/1.0.0.12B466 (iPhone; U; CPU OS 8_1_3 like Mac OS X; da_dk)
)
Итак, мой вопрос — есть ли хороший эквивалент этого в Go? Я пробовал некоторые из различных методов регулярных выражений, но не могу найти тот, который работает для меня.
Спасибо
Во-первых, вам нужно знать, что вам может понадобиться изменить сам шаблон регулярного выражения, так как движок регулярных выражений go не ведет себя точно так же, как движок регулярных выражений PHP. Оба используют регулярные выражения PCRE, где PHP реализует больше возможностей, чем go. Однако ваш шаблон из примера должен работать без изменений.
Вот пример программы на go, которая работает как PHP preg_match()
:
package main
import "fmt"import "regexp"
func main() {
str := `100.100.100.100 - - [23/Feb/2015:03:03:56 +0100] "GET /folder/file.mp3 HTTP/1.1" 206 5637064 "-" "AppleCoreMedia/1.0.0.12B466 (iPhone; U; CPU OS 8_1_3 like Mac OS X; da_dk)"`
r, _ := regexp.Compile(`([.0-9]+) .*?\[([0-9a-zA-Z:\/+ ]+)\].*?"[A-Z]+ \/([^\/ ]+)\/([a-zA-Z0-9\-.]+).*" ([0-9]{3}) .*"(.*?)"$`)
// Using FindStringSubmatch you are able to access the
// individual capturing groups
for index, match := range r.FindStringSubmatch(str) {
fmt.Printf("[%d] %s\n", index, match)
}
}
Выход:
[0] 100.100.100.100 - - [23/Feb/2015:03:03:56 +0100] "GET /folder/file.mp3 HTTP/1.1" 206 5637064 "-" "AppleCoreMedia/1.0.0.12B466 (iPhone; U; CPU OS 8_1_3 like Mac OS X; da_dk)"[1] 100.100.100.100
[2] 23/Feb/2015:03:03:56 +0100
[3] folder
[4] file.mp3
[5] 206
[6] AppleCoreMedia/1.0.0.12B466 (iPhone; U; CPU OS 8_1_3 like Mac OS X; da_dk)
Пожалуйста, проверьте руководство о регулярных выражениях go: http://golang.org/pkg/regexp/
Других решений пока нет …