将有限范围的元素与模式匹配

时间:2011-08-19 13:12:28

标签: wolfram-mathematica

在处理我对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个元素?还有哪个更快?

1 个答案:

答案 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