使用正向前瞻(?=正则表达式)和re2

a8m*_*a8m 10 regex go re2

因为我对re2有点新意,所以我试图弄清楚如何(?=regex)Go中使用JS,C++或任何PCRE风格的正面观察.

以下是我正在寻找的一些例子.

JS:

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

蟒蛇:

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

非常感谢.

Kob*_*obi 12

根据语法文档,不支持此功能:

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

另外,来自WhyRE2:

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


Ain*_*r-G 5

您可以使用更简单的正则表达式实现此目的:

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

sm[1]将是你的比赛.游乐场:http://play.golang.org/p/Vyah7cfBlH

  • @stribizhev(wrt你的"直到前瞻是在Go中实现"评论),我怀疑这些功能是否会被添加到Go或Go将从使用RE2切换.(虽然你可以使用第三方PCRE包,但我不建议这样做).大多数/所有这些"功能"都不受支持,因为基本设计是在"高级"(但缓慢/危险)功能与速度和安全性(在运行时/内存方面)之间进行的慎重选择.有关详细信息,请参阅https://swtch.com/~rsc/regexp/regexp1.html(或查看图表). (4认同)
  • FWIW,最近关于在类似 PCRE 的引擎中处理线性时间前瞻的研究:https://medium.com/@davisjam/using-selective-memoization-to-defeat-regular-expression-denial-of-service-f7acbbd34792 (4认同)
  • 是的,捕获组是实现这一目标的唯一方法......至少在 Go 中实现前瞻之前, (2认同)