我需要一个可以有4种格式之一的字符串:
html
text
attachment
email:[address]
我需要一个能够正确捕获两件事的正则表达式:$type
,html
,text
,attachment
或email
,以及$arg
,如果[address]
为$type
则为email
,否则为undef
。如果$type
不是email
,则根本不应该匹配。我写过这个正则表达式:
m/(html|email|text|attachment):?(.*)/;
即使存在text
,html
或attachment
的内容,也存在匹配的问题,如果没有:
,也会匹配。因此,例如,emailme@foo.com
会给("email", "me@foo.com")
。我也试过这个:
m/(html)|(email):(.*)|(text)|(attachment)/;
这导致5组。有没有办法捕捉我想要的方式,这样如果在email
之后没有冒号,或者在其他地方之后有冒号,我将得不到匹配?
答案 0 :(得分:3)
是的,为此,您可以使用分支重置功能:(?|...|...|...)
/(?|(html)|(email):(.*)|(text)|(attachment))/
在分支重置中,每个备选项的捕获组具有相同的数字。
要排除,“html”,“text”,“attachment”后跟其他任何内容(包括冒号),您需要右侧的条件(锚点,前瞻或其他)。同样的事情开始。