Я пытаюсь использовать негативный прогноз в Go:
Следующее регулярное выражение: BBB(((?!BBB).)*)EEE
http://rubular.com/r/Zw1vopp1MF
Однако в Go я получаю:
error parsing regexp: invalid or unsupported Perl syntax: `(?!`
Есть ли альтернативы?
Я пытаюсь использовать негативный прогноз в Go:
Следующее регулярное выражение: BBB(((?!BBB).)*)EEE
http://rubular.com/r/Zw1vopp1MF
Однако в Go я получаю:
error parsing regexp: invalid or unsupported Perl syntax: `(?!`
Есть ли альтернативы?
Отрицательный взгляд не поддерживается по техническим причинам, особенно потому, что он противоречит гарантиям O (n) -time библиотеки. См. обсуждение группы golang-nuts об этом, а также раздел Предостережения в Регулярное выражение в дикой природе.
Вы можете выразить регулярное выражение, которое вы описали, без отрицательного обзора:
BBB([^B]|B[^B]|BB[^B])*EEE
Вот пример , чтобы продемонстрировать:
package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`BBB([^B]|B[^B]|BB[^B])*EEE`)
fmt.Printf("%#v\n", re.FindAllString("BBB EEE BBB..BBB...EEE", -1))
}
Исходя из ваших примеров и ожидаемого результата, будет работать следующее.
re := regexp.MustCompile(`BBB([^B]*)EEE`)
dlclark/regexp2 является портом платформы .NET framework System.Text.RegularExpressions.Regex
.
Существуют некоторые фундаментальные различия между строками .NET и строками Go, которые также нуждаются в заимствовании из механизма регулярных выражений Go. Я очистил пару более грязных битов во время порта (regexcharclass.cs был ужасен), но дерево синтаксиса, код опущен, и поэтому сопоставленные шаблоны должны быть идентичными.
Это имя упало в конце продолжительное обсуждение регулярных выражений O (n) и опустилось:
Однако я бы посоветовал предупредить, так как есть преимущества для двигателя, основанного на re2, который не предоставляется более полнофункциональными двигателями с поисковыми системами. Если у вас есть опция, придерживайтесь stdlib.
Стоимость функций - это более медленная реализация.