【问题标题】:Regex match between two tags or else match everything两个标签之间的正则表达式匹配,否则匹配所有内容
【发布时间】:2013-10-31 23:17:21
【问题描述】:

我有一个电子邮件地址列表,有多种形式:

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

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

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

  1. (?&lt;=\&lt;)(.*)(?=\&gt;) 上捕获。
  2. 如果没有匹配,请使用整个文本。

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

【问题讨论】:

  • 你用什么语言来实现这个?
  • @scrowler:Visual Basic(工作)
  • 你在 .NET 中工作吗?

标签: regex


【解决方案1】:

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

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

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

【讨论】:

  • 很有趣,但我不太明白。它也不适用于RegExr
【解决方案2】:

您在寻找异或运算符。 Have a look here.

(\&lt;.+\@.+\..+\&gt;) 仅匹配 &lt;&gt; 中的那些电子邮件地址... (\&lt;.+\@.+\..+\&gt;)|(.+) 匹配所有内容而不是匹配 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;
}

【讨论】:

  • 我希望我能将 2 个答案标记为正确,因为您的答案非常有帮助且内容丰富。谢谢。
【解决方案3】:

怎么样:

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

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

说明:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-22
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-01
    • 2016-05-04
    • 1970-01-01
    相关资源
    最近更新 更多