【问题标题】:Regex to find or extract strings between the "<>" angle brackets正则表达式查找或提取“<>”尖括号之间的字符串
【发布时间】:2010-12-07 04:50:59
【问题描述】:

在下面的字符串中,

Jason <jason@bigcreative.com>

如何提取尖括号内的部分?

我试过&lt;\w&gt;,但没用。

想法?

我在 PHP 中使用 preg_match(),如果这有影响的话。

【问题讨论】:

    标签: php regex email


    【解决方案1】:

    user502515 已经给出了你想要的正则表达式。

    我想补充一下为什么您的正则表达式 &lt;\w&gt; 不起作用:

    \w 是字符类 [a-zA-Z0-9_] 的缩写,匹配该类中的任何 one 字符。要匹配更多字符,您需要使用量词:

    • + 表示一项或多项,并且
    • * 零个或多个

    由于您要提取与模式匹配的字符串,您需要将模式括在括号中 (..) 以便它被捕获。

    现在您最初的任务是提取 &lt;..&gt; 之间的字符串,正则表达式 &lt;(\w+)&gt; 将无法完成这项工作,因为 char 类 \w 不包括 @

    要匹配任何内容,请使用匹配任意字符串(不带换行符)的正则表达式 .*

    所以正则表达式&lt;(.*)&gt; 匹配并捕获尖括号之间的任何字符串。

    匹配是贪心的,所以如果输入字符串是foo&lt;foo@foo.com&gt;, bar&lt;bar.com&gt;,您将提取foo@foo.com&gt;, bar&lt;bar.com。要解决此问题,您可以通过在 .* 末尾添加 ? 来使匹配不贪婪,从而为我们提供正确的正则表达式 &lt;(.*?)&gt;

    【讨论】:

    • 这是一种高质量的答案,虽然它没有直接具体回答具体问题,但通过解释为什么特别有用,值得点赞。谢谢。
    【解决方案2】:

    要在&lt; 字符和下一个最接近的&gt; 之间进行匹配,中间没有&lt;&gt;(注意&lt;.*?&gt; matches strings&lt;..&lt;...&gt;),您可以使用

    <([^<>]*)>
    

    请参阅regex demo

    正则表达式详细信息

    • &lt; - 一个 &lt; 字符
    • ([^&lt;&gt;]*) - 第 1 组:除 &lt;&gt; 之外的任何零个或多个字符
    • &gt; - &gt; 字符。

    代码示例

    • - var res = Regex.Matches(text, @"&lt;([^&lt;&gt;]*)&gt;").Cast&lt;Match&gt;().Select(x =&gt; x.Groups[1].Value).ToList();
    • - const matches = [...Array.from(text.matchAll(/&lt;([^&lt;&gt;]*)&gt;/g), x =&gt; x[1])]
    • - $res = preg_match_all('~&lt;([^&lt;&gt;]*)&gt;~', $text, $matches) ? $matches[1] : "";
    • - res = re.findall(r'&lt;([^&lt;&gt;]*)&gt;', text)

    【讨论】:

      【解决方案3】:

      然后使用&lt;(.*?)&gt; 作为正则表达式。

      【讨论】:

      • 使用&lt;([^&gt;]+)&gt;。它会更快。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-03
      • 2011-07-17
      相关资源
      最近更新 更多