两个标签之间的正则表达式匹配或者匹配所有内容

时间:2013-10-22 21:35:52

标签: regex

我有一个电子邮件地址列表,其中包含各种形式:

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

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

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

  1. 捕获(?<=\<)(.*)(?=\>)
  2. 如果没有匹配项,请使用整个文本。
  3. 但现在我想知道:这两个步骤可以简化成一个简单的正则表达式吗?

3 个答案:

答案 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)

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

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

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