因为我对re2有点陌生,所以我试图弄清楚如何在Go中使用像JS,C++或任何PCRE风格的积极前瞻(?=regex)。这里有一些我正在寻找的例子。
(?=regex)
JS:
'foo bar baz'.match(/^[\s\S]+?(?=baz|$)/);
字符串
Python:
re.match('^[\s\S]+?(?=baz|$)', 'foo bar baz')
型
'foo bar '
多谢了
rdlzhqv91#
根据Syntax Documentation,不支持此功能:(?=re)在文本匹配re之前(不支持)WhyRE2:作为一个原则问题,RE2不支持已知只存在回溯解的构造。因此,不支持反向引用和查找Assert。
(?=re)
re
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
sm[1]
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**之前有其他字符的地址。
(?i)
[\w]{1,6}
noreply
no@google.com
[a-mo-z0-9_][\w]*
n
@google.com
n[a-np-z0-9_][\w]*
no[a-qs-z0-9_][\w]*
noreply[\w]*
3条答案
按热度按时间rdlzhqv91#
根据Syntax Documentation,不支持此功能:
(?=re)
在文本匹配re
之前(不支持)WhyRE2:
作为一个原则问题,RE2不支持已知只存在回溯解的构造。因此,不支持反向引用和查找Assert。
2lpgd9682#
你可以用一个更简单的regexp来实现:
字符串
sm[1]
将是你的比赛。Playground:http://play.golang.org/p/Vyah7cfBlH8hhllhi23#
如果你想匹配一个宽泛的模式,但在正则表达式中排除特定的子字符串,你可以使用一种叫做“逐步排除”的技术
该技术涉及迭代地细化正则表达式以逐个字符地排除特定序列。
让我们考虑一个例子。假设你想匹配所有以“@ www.example.com”结尾的电子邮件地址google.com,但排除特定的地址“noreply@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
**之前有其他字符的地址。