我有一个电子邮件字段,可以用几种不同的方式格式化。
-
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>'
请帮忙吗?
更新:
这应该是你想要的:
^(?:"?([^@"]+)"?'s)?<?([^>]+@[^>]+)>?$
这将把第一部分(如果有的话)存储到第一个捕获组中,并将电子邮件地址存储到第二个捕获组中。
这个正则表达式看起来不太对。无论如何,在执行此regex期间会发生"Backtrack limit was用尽"错误(您可以使用preg_last_error函数检查它),因此您可以增加Backtrack limit以使其工作:
ini_set('pcre.backtrack_limit', 1000000);
var_dump(preg_replace('~"?([^"]+)*"?'s<?([^>]+@[^>]+)>?~', '["$1","$2"]', 'hello@world.com'));
输出:
string(15) "hello@world.com"
Ruby(1.9+)
$ ruby -e 'p gets.scan(/"?([^"]+)*"?'s<?([^>]+@[^>]+)>?/)' <<< '"Hello World" <helloworld@gmail.com>'
[["Hello World", "helloworld@gmail.com"]]