正则表达组,直到组内最后一次出现

时间:2018-04-05 13:45:32

标签: php regex

我目前正在学习正则表达式并且它很好。我现在想要检查电子邮件地址。基本上它一切都很好,我发现自己陷入了一个我似乎无法解决的小问题。

我看到你可以使用"环视"选项,但我无法让他们工作。 我想要的是我的小组匹配到最后@个标志。例如,

my-email@outlook.com会让我回来my-emailmy-@-email@outlook.com会让我回来my-@-email

不幸的是,我的代码只会让我回到my-,因为我停在了@的位置。

以下是我的注册表和我查看的电子邮件地址。

我希望有人可以向我解释如何管理它以找到所有内容,换句话说,其中包含多个&符号的电子邮件地址。

([a-zA-z0-9._\-!#$%&'*+\/=?^_`{|}~"\(\)<>:,;]+|\"[a-zA-z0-9._\-!#$%&'*+\/=?^_`{|}~"\(\)<>:,; @]+\")@([a-zA-Z0-9\-]+|\[(.*)\])\.?([a-zA-Z0-9\-]+)?

我检查的电子邮件地址(只有2个不能正常工作,john.smith@worldwideweb.123com_org"John."(),:;<>@[\].Doe"@.123radio_tv)

info@kamikaze.uk
alfred@live.nl
dubai@organon.it
karel.de.koning@hetnet.nl
decock@upc.nl
jiazhe_xu@sina.cn
xfunkblasterx@yahoomail.org
super-duper-email@hotmail.com

"John..Doe"@example.com
john.smith(comment)@example.com
(comment)john.smith@example.com
john.smith@worldwideweb.123com_org
"John."(),:;<>@[\].Doe"@.123radio_tv
"much.more unusual"@example.com
other.email-with-dash@example.com
disposable.style.email.with+symbol@example.com
"()<>[]:,;@\\"!#$%&'-/=?^_`{}| ~.a"@example.org

smith@[IPv6:2001:db8::1]
jsmith@[192.168.2.1]

祝你好运

P.S。我使用https://regex101.com/使用提供的电子邮件地址检查正则表达式

3 个答案:

答案 0 :(得分:2)

我修改了你的正则表达式并提出了这个:

 ([!-Z^-~]+|\"[ -z^-~]+\")@([\w-]+|\[(.*)\])?\.?([\w-]+)?

你的正则表达式无法匹配你想要匹配的一些东西的主要原因是因为它需要匹配的一些字符没有包含在正则表达式中。 (@之前@不属于正则表达式的部分,_未包含在正则表达式的域名部分中

答案 1 :(得分:1)

如果您想更加接近电子邮件正则表达式规范(RFC5322)
您应该尝试这样的事情:

原始

php artisan serve

字符串和定界符

(?im)^(?=.{1,64}@)(?:("[^"\\]*(?:\\.[^"\\]*)*"@)|((?:(?:\([^)]*\)|[^\W_])(?:\.(?!\.)|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w]|\([^)]*\))*)?[^\W_](?:\([^)]*\))?@))(?=.{1,255}$)(?:(\[[^\[\]]+\])|((?:(?=.{1,63}\.)[^\W_][-\w]*[^\W_]*\.)+[^\W_](?:[^\W_]|-){0,22}[^\W_])|((?=.{1,63}$)[^\W_][-\w]*))$

https://regex101.com/r/DmX7pA/1

解释

'~(?im)^(?=.{1,64}@)(?:("[^"\\\]*(?:\\\.[^"\\\]*)*"@)|((?:(?:\([^)]*\)|[^\W_])(?:\.(?!\.)|[-!#\$%&\'\*\+/=\?\^`\{\}\|\~\w]|\([^)]*\))*)?[^\W_](?:\([^)]*\))?@))(?=.{1,255}$)(?:(\[[^\[\]]+\])|((?:(?=.{1,63}\.)[^\W_][-\w]*[^\W_]*\.)+[^\W_](?:[^\W_]|-){0,22}[^\W_])|((?=.{1,63}$)[^\W_][-\w]*))$~'

答案 2 :(得分:0)

如果您要接受多个@,我认为这是正确的正则表达式:

([\w@.\"\-!#$%&'*+\/=?^_`{|}~"\(\)<>:,;\[\]\\ ]+)(@)((([\w@.\"\-]*)(\.)([\w@.\"\-]+))|(\[[\w:.]+\]))

您可以在此处使用收到的所有电子邮件进行测试

您可以在这里检查它https://regexr.com/4iqs1我已经用您说过的所有电子邮件对其进行了测试

第一组

([\w@.\"\-!#$%&'*+\/=?^_`{|}~"\(\)<>:,;\[\]\\ ]+)

是最后一个@之前的

第二组只是一个@

(@)

第三组是

(([\w@.\"\-]*)(\.)([\w@.\"\-]+)) //It has 3 groups , first one before . second . and third is after .

(\[[\w:.]+\]) //IT IS FOR IP