消极的前瞻去正则表达式

K2x*_*2xL 27 regex go

我试图在Go中使用负向前瞻:

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

http://rubular.com/r/Zw1vopp1MF

但是在Go中我得到:

error parsing regexp: invalid or unsupported Perl syntax: `(?!`
Run Code Online (Sandbox Code Playgroud)

还有其他选择吗?

dyo*_*yoo 23

由于技术原因,不支持否定前瞻,特别是因为它与库的O(n)时间保证冲突.请参阅关于此的golang-nuts小组讨论,以及Wild 中正则表达式匹配中的警告部分.

您可以表达您所描述的正则表达式而不会出现负面前瞻:

BBB([^B]|B[^B]|BB[^B])*EEE
Run Code Online (Sandbox Code Playgroud)

这是一个示例:

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))
}
Run Code Online (Sandbox Code Playgroud)


And*_*ndy 5

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

.NET 字符串和 Go 字符串之间存在一些根本区别,这也需要从 Go 框架正则表达式引擎中借鉴一些东西。我在移植期间清理了一些更脏的位(regexcharclass.cs 很糟糕),但解析树、代码发出,因此匹配的模式应该是相同的。

它的名字在关于 O(n) 正则表达式冗长讨论结束时被删除,并被警告:

但是,我建议谨慎,因为基于 re2 的引擎有一些好处,而这些好处是具有环视功能的更全功能的引擎所无法提供的。如果你有选择,那么坚持使用标准库。

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


hwn*_*wnd 4

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

re := regexp.MustCompile(`BBB([^B]*)EEE`)
Run Code Online (Sandbox Code Playgroud)

GoPlay

  • 是的,不支持。 (6认同)
  • 这可能是一个解决方案,但针对不同的问题。问题是关于负向前瞻。 (3认同)
  • 对于类似以下内容,这似乎会失败:“BBB xx B xx EEE” (2认同)