我有一个电子邮件地址列表,其中包含各种形式:
john@smith.com
Angie <angie@aol.com>
"Mark Jones" <mark@jones.com>
我正在尝试仅剪切每个电子邮件部分。例如:我只想要列表中第二项的angie@aol.com
。换句话说,我想匹配<
和>
之间的所有内容,或者如果它不存在则匹配所有内容。
我知道这可以分两步完成:
(?<=\<)(.*)(?=\>)
。但现在我想知道:这两个步骤可以简化成一个简单的正则表达式吗?
答案 0 :(得分:1)
您是独家经营者或经营者。 Have a look here.
(\<.+\@.+\..+\>)
仅匹配<>
侧的电子邮件地址...
(\<.+\@.+\..+\>)|(.+)
匹配匹配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;
}
答案 1 :(得分:1)
怎么样:
(?<=\<).*(?=\>)|^[^<]*$
^[^>]*$
将匹配整个字符串,但前提是它不包含<
。那就是你所拥有的(|
)。
<强>解释强>
^
- 字符串的开头
[^<]
- 不是 - <
字符
[^<]*
- 零或更多不 - <
个字符
$
- 字符串结尾
答案 2 :(得分:0)
这是可能的,但您当前的逻辑可能更简单。以下是我提出的建议,电子邮件地址将始终位于第一个捕获组中:
^(?:.*<|)(.*?)(?:>|$)