将正向前瞻 (?=regex) 与 re2 一起使用

问题描述 投票:0回答:3

由于我对 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 '

非常感谢。

regex go re2
3个回答
20
投票

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

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

另外,来自WhyRE2

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


13
投票

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

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

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


0
投票

如果您想要匹配广泛的模式,但纯粹在正则表达式中排除特定子字符串,您可以使用一种称为“逐步排除”的技术

此技术涉及迭代地细化正则表达式以逐个字符地排除特定序列。

让我们考虑一个例子。假设您想要匹配所有以“@google.com”结尾的电子邮件地址,但排除特定地址“[email protected]”。以下是如何使用逐步排除技术构建这样的正则表达式:

^(?i)([\w]{1,6}|[a-mo-z0-9_][\w]*|n[a-np-z0-9_][\w]*|no[a-qs-z0-9_][\w]*|nor[a-df-z0-9_][\w]*|nore[a-oq-z0-9_][\w]*|norep[a-km-z0-9_][\w]*|norepl[a-xz0-9_][\w]*)@google\.com

模式分解

  1. (?i)
    :此标志使正则表达式不区分大小写。
  2. [\w]{1,6}
    :此部分与包含
    noreply
    较短但不完整部分的任何电子邮件地址匹配,例如
    [email protected]
  3. [a-mo-z0-9_][\w]*
    :此部分匹配以任何字母数字字符或下划线开头(
    n
    除外)并以
    @google.com
    结尾的任何电子邮件。
  4. 模式的每个后续部分(例如,
    n[a-np-z0-9_][\w]*
    no[a-qs-z0-9_][\w]*
    等)旨在逐步排除“noreply”中以相同顺序出现的字符。
  5. 最后一部分,
    noreply[\w]*
    ,匹配以 'noreply' 开头且在
    @google.com
    之前有其他字符的地址。
© www.soinside.com 2019 - 2024. All rights reserved.