【问题标题】:Using positive-lookahead (?=regex) with re2使用正向预测 (?=regex) 和 re2
【发布时间】:2015-07-30 02:17:52
【问题描述】:

由于我对re2 有点陌生,我正试图弄清楚如何在Go 中使用正向预测(?=regex),如JS、C++ 或任何PCRE 样式。

以下是我正在寻找的一些示例。

JS:

'foo bar baz'.match(/^[\s\S]+?(?=baz|$)/);

Python:

re.match('^[\s\S]+?(?=baz|$)', 'foo bar baz')
  • 注意:两个例子都匹配'foo bar '

非常感谢。

【问题讨论】:

  • 查看github.com/google/re2/wiki/Syntax - 在文本匹配re(不支持)之前有一行说“(?=re)”。这看起来不太好。此外,它说“替代回溯正则表达式引擎” - 暗示他们会放弃一些功能。
  • 我想这是一种答案,所以我添加了一个。
  • @Kobi 现在有dlclark/regexp2 可用
  • @Andy - 谢谢!所以 Go 有 regexp(即 re2)和 regexp2(不是 re2)。这是一个糟糕的库名称选择——我认为这比 Python 的 reregex:P 更令人困惑。看起来它是从带有balancing groups 的.Net 移植的,它们是my favorite regex feature - 我会看看。

标签: regex go re2


【解决方案1】:

根据Syntax Documentation,不支持此功能:

(?=re) 之前的文本匹配 re(不支持)

另外,来自WhyRE2

原则上,RE2 不支持仅已知存在回溯解决方案的构造。因此,不支持反向引用和环视断言。

【讨论】:

    【解决方案2】:

    您可以使用更简单的正则表达式来实现这一点:

    re := regexp.MustCompile(`^(.+?)(?:baz)?$`)
    sm := re.FindStringSubmatch("foo bar baz")
    fmt.Printf("%q\n", sm)
    

    sm[1] 会是你的对手。游乐场:http://play.golang.org/p/Vyah7cfBlH

    【讨论】:

    • 是的,捕获组是实现这一目标的唯一方法……至少,在 Go 中实现前瞻之前,
    • @stribizhev(写下您的“直到在 Go 中实现前瞻”评论),我怀疑这些功能是否会被添加到 Go 中,或者 Go 是否会从使用 RE2 切换。 (尽管您可能会使用第三方 PCRE 包,但我不建议这样做)。由于基本设计是在“高级”(但缓慢/危险)功能与速度和安全性(在运行时/内存方面)之间做出的慎重选择,因此不支持大多数/所有这些“功能”。有关详细信息,请参阅swtch.com/~rsc/regexp/regexp1.html(或仅查看图表)。
    • FWIW,最近关于处理类似 PCRE 引擎的线性时间前瞻的研究:medium.com/@davisjam/…
    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 1970-01-01
    • 2017-12-17
    • 2018-03-29
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2019-08-29
    相关资源
    最近更新 更多