2012-05-14 39 views
1

嗯,我得到它的工作,但不知何故,它看起来很慢,效率低(或可能不)。有效匹配必须是序列的可选字符

我所得到的是字符序列,为简单起见,让我们只说这是

123456789 

我想要做的就是确保输入开始以同样的方式,并且是在同序列,但不需要是完整的序列。

我有什么是这样的:

^1(2(3(4(5(6(7(8(9)?)?)?)?)?)?)?)? 

这看起来很可怕,但有一个更好的方式来做到这一点?

编辑新增的^这是在原来的代码,我忘了,包括在这里。

回答

1

A?量词就像一个零件。想想没有它的发动机运转良好。如果可能的话,它会尝试着去尝试。

Sure x?x?x?x?x?看起来很糟糕。但是,它几乎没有意义,除非在某种情况下使用它。

假设你的分组只是表示选项,你可以用这个1(2(3(4(5(6(7(89?)?)?)?)?)?)?)?来排除最后一个内部组。

实施例:

1(2(3(4(5(6(7(8(9)?)?)?)?)?)?)?)?将这个

987654321 1111111111111112121211112121121212312111多次全局匹配。

所以,它的所有相对。

+0

哎呀,我忘了在原始问题中使用的正则表达式的开头添加'^',以确保它匹配字符串的开头。 所以我假设有这么多嵌套'((?)?)在这种情况下可以吗? – Shaw

+0

这应该是好的。请记住,()是一个捕获缓冲区,而(?:)用于聚类子表达式。一些引擎可能对可用捕获缓冲区的数量有限制。我看着Perl,并没有看到对嵌套分组的限制。我认为这个级别与堆栈有关。 Perl对递归级别有一个编译限制。认为它大约是50.这可能是相关的,但我不确定。 – sln