为测试数据编写正则表达式(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:
(?<=@)[^:]+
它匹配前面有 @
的非“:”字符序列。 @
未包含在匹配项中。
你可以试试([a-z])*?\.([a-z])*
(?<=@)([^:\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[^:]+
我正在尝试编写一个可以匹配以下条件的正则表达式:
匹配第一个“@”和“:”之后的所有内容。但它不应该包括这两个字符。我已经粘贴了我的测试数据。我更喜欢使用 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:
(?<=@)[^:]+
它匹配前面有 @
的非“:”字符序列。 @
未包含在匹配项中。
你可以试试([a-z])*?\.([a-z])*
(?<=@)([^:\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[^:]+