尝试在Go中使用否定前瞻:
以下正则表达式:BBB(((?!BBB).)*)EEE
http://rubular.com/r/Zw1vopp1MF
然而,在Go中我得到:
error parsing regexp: invalid or unsupported Perl syntax: `(?!`
还有其他选择吗?
答案 0 :(得分:17)
由于技术原因,不支持否定前瞻,特别是因为它与库的O(n)时间保证冲突。请参阅golang-nuts group discussion有关此问题,以及Regular Expression Matching in the Wild中的注意事项部分。
你可以表达你所描述的正则表达式而没有消极的前瞻:
BBB([^B]|B[^B]|BB[^B])*EEE
这是一个example来演示:
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))
}
答案 1 :(得分:3)
答案 2 :(得分:1)
dlclark/regexp2是.NET框架System.Text.RegularExpressions.Regex
引擎的一个端口。
.NET字符串和Go字符串之间存在一些根本区别,这些字符串需要从Go框架正则表达式引擎中借用一些东西。我在端口期间清理了几个较脏的位(regexcharclass.cs非常糟糕),但解析树,代码已发送,因此匹配的模式应相同。
它的名字在lengthy discussion about O(n) regular expressions的末尾被删除,并且被警告:
但是,我建议谨慎,因为基于re2的引擎有一些好处,而这些引擎并不是由具有外观的更多全功能引擎提供的。如果你有选择,那么坚持使用stdlib。
功能的成本是一个较慢的实现。