Отрицательный взгляд в будущее

Я пытаюсь использовать негативный прогноз в Go:

Следующее регулярное выражение: BBB(((?!BBB).)*)EEE

http://rubular.com/r/Zw1vopp1MF

Однако в Go я получаю:

error parsing regexp: invalid or unsupported Perl syntax: `(?!`

Есть ли альтернативы?

Ответ 1

Отрицательный взгляд не поддерживается по техническим причинам, особенно потому, что он противоречит гарантиям 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))
}

Ответ 2

Исходя из ваших примеров и ожидаемого результата, будет работать следующее.

re := regexp.MustCompile(`BBB([^B]*)EEE`)

GoPlay

Ответ 3

dlclark/regexp2 является портом платформы .NET framework System.Text.RegularExpressions.Regex.

Существуют некоторые фундаментальные различия между строками .NET и строками Go, которые также нуждаются в заимствовании из механизма регулярных выражений Go. Я очистил пару более грязных битов во время порта (regexcharclass.cs был ужасен), но дерево синтаксиса, код опущен, и поэтому сопоставленные шаблоны должны быть идентичными.

Это имя упало в конце продолжительное обсуждение регулярных выражений O (n) и опустилось:

Однако я бы посоветовал предупредить, так как есть преимущества для двигателя, основанного на re2, который не предоставляется более полнофункциональными двигателями с поисковыми системами. Если у вас есть опция, придерживайтесь stdlib.

Стоимость функций - это более медленная реализация.