Go语言 使用正先行(?)=regex)with re2

klsxnrf1  于 2023-08-01  发布在  Go
关注(0)|答案(3)|浏览(110)

因为我对re2有点陌生,所以我试图弄清楚如何在Go中使用像JS,C++或任何PCRE风格的积极前瞻(?=regex)
这里有一些我正在寻找的例子。

JS:

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

字符串

Python:

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

  • 注意:两个示例都匹配'foo bar '

多谢了

rdlzhqv9

rdlzhqv91#

根据Syntax Documentation,不支持此功能:
(?=re)在文本匹配re之前(不支持)
WhyRE2
作为一个原则问题,RE2不支持已知只存在回溯解的构造。因此,不支持反向引用和查找Assert。

2lpgd968

2lpgd9682#

你可以用一个更简单的regexp来实现:

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

字符串
sm[1]将是你的比赛。Playground:http://play.golang.org/p/Vyah7cfBlH

8hhllhi2

8hhllhi23#

如果你想匹配一个宽泛的模式,但在正则表达式中排除特定的子字符串,你可以使用一种叫做“逐步排除”的技术
该技术涉及迭代地细化正则表达式以逐个字符地排除特定序列。
让我们考虑一个例子。假设你想匹配所有以“@ www.example.com”结尾的电子邮件地址google.com,但排除特定的地址“noreply@google.com”。下面是如何使用逐步排除技术构造这样一个正则表达式:

^(?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):此标志使正则表达式不区分大小写。
1.[\w]{1,6}:此部分匹配任何包含**noreply较短但不完整部分的电子邮件地址,例如no@google.com**
1.[a-mo-z0-9_][\w]*:此部分匹配以任何字母数字字符或下划线(n除外)开头并以@google.com结尾的任何电子邮件。
1.模式的每个后续部分(例如
n[a-np-z0-9_][\w]*
、**no[a-qs-z0-9_][\w]*等)被设计为当“noreply”中的字符出现在相同的序列中时,逐渐排除它们。
1.最后一部分
noreply[\w]*匹配以'noreply'开头且在@google.com**之前有其他字符的地址。

相关问题