perl:在可选字符后匹配的正则表达式

时间:2017-07-25 19:44:38

标签: regex perl

我需要一个可以有4种格式之一的字符串:

  1. html
  2. text
  3. attachment
  4. email:[address]
  5. 我需要一个能够正确捕获两件事的正则表达式:$typehtmltextattachmentemail,以及$arg,如果[address]$type则为email,否则为undef。如果$type不是email,则根本不应该匹配。我写过这个正则表达式:

    m/(html|email|text|attachment):?(.*)/;
    

    即使存在texthtmlattachment的内容,也存在匹配的问题,如果没有:,也会匹配。因此,例如,emailme@foo.com会给("email", "me@foo.com")。我也试过这个:

    m/(html)|(email):(.*)|(text)|(attachment)/;
    

    这导致5组。有没有办法捕捉我想要的方式,这样如果在email之后没有冒号,或者在其他地方之后有冒号,我将得不到匹配?

1 个答案:

答案 0 :(得分:3)

是的,为此,您可以使用分支重置功能:(?|...|...|...)

/(?|(html)|(email):(.*)|(text)|(attachment))/

在分支重置中,每个备选项的捕获组具有相同的数字。

要排除,“html”,“text”,“attachment”后跟其他任何内容(包括冒号),您需要右侧的条件(锚点,前瞻或其他)。同样的事情开始。