0

我有一个电子邮件地址列表,它采用各种形式:

john@smith.com
Angie <angie@aol.com>
"Mark Jones" <mark@jones.com>

我试图只从每个中删除电子邮件部分。例如:我只想要angie@aol.com列表中的第二项。换句话说,我想匹配 and 之间的所有内容<>或者如果不存在则匹配所有内容。

我知道这可以分两步完成:

  1. 捕获(?<=\<)(.*)(?=\>)
  2. 如果没有匹配项,请使用整个文本。

但现在我想知道:这两个步骤可以简化为一个简单的正则表达式吗?

4

3 回答 3

1

你在排他或运算符之后。看看这里。

(\<.+\@.+\..+\>)仅匹配那些电子邮件地址<>... (\<.+\@.+\..+\>)|(.+)匹配所有内容,而不是匹配 OR 中的第一个条件然后跳过第二个条件。

根据您用于实现此正则表达式的语言,您可能能够使用内置的独占或运算符。否则,如果没有找到匹配项,您可能需要在其中添加一些逻辑来使用该字符串。例如(伪类型代码):

string = 'your data above';
if( regex_finds_match ( '(\<.+\@.+\..+\>)', string ) ) {
    // found match, use the match
    str_to_use = regex_match(es);
} else {
    // didn't find a match:
    str_to_use = string;
}
于 2013-10-22T21:53:35.320 回答
1

关于什么:

(?<=\<).*(?=\>)|^[^<]*$

^[^>]*$将匹配整个字符串,但前提是它不包含<. |这就是你所拥有的 OR'ed ( )。

解释:

^- 字符串开头
[^<]- 非<字符
[^<]*- 零个或多个非<字符
$- 字符串结尾

于 2013-10-22T21:55:08.350 回答
0

这是可能的,但您当前的逻辑可能更简单。这是我想出的,电子邮件地址将始终位于第一个捕获组中:

^(?:.*<|)(.*?)(?:>|$)

示例:http ://rubular.com/r/8tKHaYYY4T

于 2013-10-22T21:46:00.583 回答