由于我对 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 '
非常感谢。
您可以使用更简单的正则表达式来实现此目的:
re := regexp.MustCompile(`^(.+?)(?:baz)?$`)
sm := re.FindStringSubmatch("foo bar baz")
fmt.Printf("%q\n", sm)
sm[1]
将是你的对手。游乐场:http://play.golang.org/p/Vyah7cfBlH
如果您想要匹配广泛的模式,但纯粹在正则表达式中排除特定子字符串,您可以使用一种称为“逐步排除”的技术
此技术涉及迭代地细化正则表达式以逐个字符地排除特定序列。
让我们考虑一个例子。假设您想要匹配所有以“@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
模式分解
(?i)
:此标志使正则表达式不区分大小写。[\w]{1,6}
:此部分与包含 noreply
较短但不完整部分的任何电子邮件地址匹配,例如 [email protected]
[a-mo-z0-9_][\w]*
:此部分匹配以任何字母数字字符或下划线开头(n
除外)并以@google.com
结尾的任何电子邮件。n[a-np-z0-9_][\w]*
、no[a-qs-z0-9_][\w]*
等)旨在逐步排除“noreply”中以相同顺序出现的字符。noreply[\w]*
,匹配以 'noreply' 开头且在 @google.com
之前有其他字符的地址。