为测试数据编写正则表达式(PCRE)

writing Regular expression for test data(PCRE)

我正在尝试编写一个可以匹配以下条件的正则表达式:

匹配第一个“@”和“:”之后的所有内容。但它不应该包括这两个字符。我已经粘贴了我的测试数据。我更喜欢使用 http://regexpal.com/ 来测试我的正则表达式。 例如,如果测试字符串是 "pop3://abby@abby.com:43598743abby@173.201.192.199:110"

那么正则表达式应该匹配 "abby.com"

pop3://abby@abby.com:43598743abby@173.201.192.199:110
pop3://abby@abby.com:abby243234@173.201.192.199:110
smtp://tania@abby.ca:abby3@69.49.109.86:25
pop3://tania@abby.ca:abbya13@69.49.109.86:110
pop3://abby@abby.com:abby9675@173.201.193.199:110
pop3://abby@abby.com:abby12345@173.201.193.199:110
smtp://abby:820211ly520@202.108.6.242:25
pop3://smartinez@abby.com:abby123@64.26.60.221:110

我会简单地使用:

/@([^:]+):/

它匹配 @: 之间的字符串,结果在组 1 中。

我会使用 lookbehind assertion:

(?<=@)[^:]+

它匹配前面有 @ 的非“:”字符序列。 @ 未包含在匹配项中。

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

你可以试试([a-z])*?\.([a-z])*

Demo

(?<=@)([^:\d]+):

更多detail

如果我理解得很好,当用户名 电子邮件地址时,您想提取电子邮件地址的域。为了更清楚,第一行可以分成这些部分:

pop3://abby@supremefill.com:ash9675@173.201.192.199:110

[scheme] => pop3
[host]   => 173.201.192.199
[port]   => 110
[user]   => abby@supremefill.com
[pass]   => ash9675

所以用户名是 abby@supremefill.com 并且这个电子邮件地址的域是 supremefill.com.

请注意,对于第 smtp://liangyuan820211:820211ly520@202.108.6.242:25 行,用户名不是电子邮件地址:liangyuan820211,那么这一行不能 return 任何结果。

提取域的一种有效方法是将模式锚定在行的开头(以快速丢弃可能尝试使用该模式的无用位置),默认情况下,notepad++ 中的正则表达式引擎设置为多行模式(在此模式下 ^ 代表 start of the line。要丢弃所有行的开头,直到域名,您可以使用 \K.

^[^@:]+:[^@:]+@\K[^:]+

demo