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

Wolfram mathematica 将有限范围的元素与模式匹配,wolfram-mathematica,Wolfram Mathematica,在研究我的答案时,我突然想到,很难匹配有限范围的元素。使用内置模式,可以匹配1个元素()、1个或多个元素()、或零个或多个元素()。为了匹配多个元素,我使用 a:PatternSequence[_,_,_] 或者更一般地说 a:PatternSequence@@Array[_&,3]. (使用a也会起作用。)为了匹配n到m个元素的范围,我们可以 a:Alternatives@@( PatternSequence @@@ Array[_&, {n,m}] ), 但这是一个相当

在研究我的答案时,我突然想到,很难匹配有限范围的元素。使用内置模式,可以匹配1个元素(
)、1个或多个元素(
)、或零个或多个元素(
)。为了匹配多个元素,我使用

a:PatternSequence[_,_,_]
或者更一般地说

a:PatternSequence@@Array[_&,3].
(使用a也会起作用。)为了匹配n到m个元素的范围,我们可以

a:Alternatives@@( PatternSequence @@@ Array[_&, {n,m}] ),
但这是一个相当复杂的方式来完成一些可以通过

a__ /; n <= Length[{a}] <= m.

但是这可以单独使用模式来实现吗,即不使用
条件
/;
)?更具体地说,如何在不添加条件的情况下匹配0个元素?还有,哪一个更快?

也许你可以重复
做些什么。例如

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}]

+1、我从来没有想过要看一遍重复的
FullForm
。它的性能完全符合我的预期。我会等着看是否还有其他答案。对旧功能和基本功能的更新通常非常有用,但可能会在数年内被忽略。我记得在
Table
Do
中添加了{I,{2,8,34,3.5,6}}类型的索引规范。在我偶然发现这一非常有用的功能之前,它肯定已经存在多年了。但是如果你已经使用了很久,谁来查找
表格呢?+1我使用
重复的
足够多,我有一个自定义的符号。我输入这个模式:
Cases[{{1,2,3},{1},{1,2,3,4,5},{1,2},{{2,4}]
(需要
后面的空格)。坦白地说,我不知道为什么默认情况下没有类似的东西。@rcollyer我的意思是,我使用Notations包/调色板创建了一个注释,这样我的注释中的行就相当于上面文章中的顶部代码行。我已经使用它好几年了,虽然我不能排除与其他编码风格不兼容的可能性,但我还没有遇到它的问题,据我所知。@Mr.Wizard,啊。我理解。
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