如何防止正则表达式在某些字符后重新开始?

时间:2019-07-18 17:20:33

标签: regex re2

我正在尝试编写与匹配有效电子邮件地址格式的字符串匹配的正则表达式。但是,当电子邮件地址前面带有某些关键字时,我希望正则表达式不匹配(对于本示例,我们说“ blern”)。不幸的是,此正则表达式将在RE2中实现,因此,否定性回首是不可行的。

我已经设法使用下面的正则表达式部分地完成了此任务,但是我还有另一个问题:当电子邮件地址匹配有效格式时,正则表达式匹配并且被删除:

sambranson@gmail.com = xxxxxxxxxx

当关键字出现在开头时,它不匹配,因此也未编辑:

blernsambranson@gmail.com = blernsambranson@gmail.com

但是,如果关键字后面带有斜杠,则不会编辑该关键字,但是地址的其余部分为:

blern/sambranson@gmail.com = blern / xxxxxxxx

我正在尝试修复现有的正则表达式,以使这种情况不会发生,即使存在/也​​不删除整个电子邮件地址。也会发生这种情况。和-字符。

编辑:删除了对该问题的错误解释

现有正则表达式:

\b([A-Zac-z0-9]|b[A-Za-km-z0-9]|bl[A-Za-df-z0-9]|ble[A-Za-qs-z0-9]|bler[A-Za-mo-z0-9)[A-Za-z0-9._-]*[A-Za-z0-9-]@(([A-Za-z0-9]|[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9])\.)+[A-Za-z0-9]([A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])?\b

1 个答案:

答案 0 :(得分:0)

我将通过首先使用简单的子字符串搜索来搜索阻塞字符串,然后仅将正则表达式应用于阻塞字符串之前的子字符串来解决此问题。

假设这是用C ++完成的,下面是该解决方案的一些伪代码。目前,我还没有设置要编译C ++,因此您必须完成工作并进行编译,或者如果不是C ++,则必须将其转换为要使用的语言。 (我假设使用C ++,因为re2似乎是C ++库。)

std::string s = "sambranson@gmail.com = blernsambranson@gmail.com";
std::string stop = "blern";
// set sub to the part of s before stop, or to all of s if stop does not occur:
std::string sub = s.substr(0, s.find(stop));

// now apply re to sub instead of s
// your RE, after removing the "blern" exclusion parts, should do what you want:
// \b[A-Za-z0-9._-]*[A-Za-z0-9-]@(([A-Za-z0-9]|[A-Za-z][A-Za-z0-9-]*[A-Za-z0-9])\.)+[A-Za-z0-9]([A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])?\b