消极的前瞻去正则表达式

时间:2014-11-06 04:13:47

标签: regex go

尝试在Go中使用否定前瞻:

以下正则表达式:BBB(((?!BBB).)*)EEE

http://rubular.com/r/Zw1vopp1MF

然而,在Go中我得到:

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

还有其他选择吗?

3 个答案:

答案 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)

根据您的示例和预期输出,以下内容可行。

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

GoPlay

答案 2 :(得分:1)

dlclark/regexp2是.NET框架System.Text.RegularExpressions.Regex引擎的一个端口。

  

.NET字符串和Go字符串之间存在一些根本区别,这些字符串需要从Go框架正则表达式引擎中借用一些东西。我在端口期间清理了几个较脏的位(regexcharclass.cs非常糟糕),但解析树,代码已发送,因此匹配的模式应相同。

它的名字在lengthy discussion about O(n) regular expressions的末尾被删除,并且被警告:

  

但是,我建议谨慎,因为基于re2的引擎有一些好处,而这些引擎并不是由具有外观的更多全功能引擎提供的。如果你有选择,那么坚持使用stdlib。

功能的成本是一个较慢的实现。