在处理我对question的回答时,我突然想到很难匹配有限范围的元素。使用内置模式,您可以匹配1个元素(_
),1个或多个元素(__
)或零个或多个元素(___
)。为了匹配多个元素,我使用PatternSequence
,就像这样
a:PatternSequence[_,_,_]
或者,更一般地说
a:PatternSequence@@Array[_&,3].
(使用Condition
也会有用。)为了匹配我们可以做的n到m个元素的范围
a:Alternatives@@( PatternSequence @@@ Array[_&, {n,m}] ),
但这是一种相当复杂的方式来完成可以通过
完成的事情a__ /; n <= Length[{a}] <= m.
然而,这提出了一个有趣的问题,使用Condition
形式直接匹配范围0到n,
a___ /; Length[{a}] <= n,
但这可以单独使用模式完成,即不使用Condition
(/;
)吗?更具体地说,如何在不添加条件的情况下匹配0个元素?还有哪个更快?
答案 0 :(得分:15)
也许你可以用Repeated
做点什么。 E.g。
Cases[{{1, 2, 3}, {1}, {1, 2, 3, 4, 5}, {1,2}}, {Repeated[_, {2, 4}]}]
给出与
相同的结果Cases[{{1, 2, 3}, {1}, {1, 2, 3, 4, 5}, {1,2}}, {a___ /; 2 <= Length[{a}] <= 4}]
第一种方法似乎比第二种方法快。例如
tab = Table[Range[RandomInteger[1000]], {1000}];
Timing[t1 = Cases[tab, {a___ /; 0 <= Length[{a}] <= 100}];]
Timing[t2 = Cases[tab, {Repeated[_, {0, 100}]}];]
SameQ[t1, t2]
在我的系统上返回
{0.027801, Null}
{0.000733, Null}
True