我有一个可以通过几种不同方式格式化的电子邮件字段。
hello@world.com
"hello world" <hello@world.com>
hello world <hello@world.com>
我想捕获hello world字符串(如果它在那里)和电子邮件地址(如果它在那里)。我有一个几乎有效的正则表达式,但它并不完全。
sed -r 's/"?([^"]+)*"?\s<?([^>]+@[^>]+)>?/["\1","\2"]/' <<< 'Hello World <helloworld@gmail.com>'
请帮帮忙?
答案 0 :(得分:3)
更新
这应该做你想要的:
^(?:"?([^@"]+)"?\s)?<?([^>]+@[^>]+)>?$
这会将第一部分(如果有的话)存储到第一个捕获组中,将电子邮件地址存储到第二个组中。
答案 1 :(得分:2)
正则表达式看起来不太对劲。无论如何,在执行此正则表达式期间出现“Backtrack limit is exhausted”错误(您可以使用preg_last_error函数进行检查),这样您就可以增加回溯限制以使其正常工作:
ini_set('pcre.backtrack_limit', 1000000);
var_dump(preg_replace('~"?([^"]+)*"?\s<?([^>]+@[^>]+)>?~', '["$1","$2"]', 'hello@world.com'));
输出:
string(15) "hello@world.com"
答案 2 :(得分:1)
红宝石(1.9 +)
$ ruby -e 'p gets.scan(/"?([^"]+)*"?\s<?([^>]+@[^>]+)>?/)' <<< '"Hello World" <helloworld@gmail.com>'
[["Hello World", "helloworld@gmail.com"]]