正则表达式重复:如何匹配变量长度的表达式?

时间:2013-06-11 19:26:14

标签: perl

基本上,这就是我想要做的事情:

if ($expression =~ /^\d{num}\w{num}$/)
{
     #doSomething
}

其中num不是标识符,但可以代表任何大于0的整数(\d\w被任意选择)。我希望匹配一个字符串,如果它包含两组相关字符,一组紧跟另一组,并且每组中的字符数相同。

对于此示例,123abc021202abcdef会匹配,但43abc不会,12ab3c1234acbcde也不匹配。

2 个答案:

答案 0 :(得分:6)

不要认为字符串从左到右增长,而是从外部增长:

xy
x(xy)y
xx(xy)yy

你的正则表达式会是这样的:

/^(x(?1)?y)$/

其中(?1)是对外括号的引用。 ?使其成为可选项,以便为递归匹配提供各种“基本案例”。这可能是正则表达式如何用于匹配context-free grammars的最简单示例 - 尽管使用解析器生成器或解析器组合器库通常更容易实现。

答案 1 :(得分:4)

嗯,有

if ($expression =~ /^(\d+)([[:alpha:]]+)$/ && length($1)==length($2))
{
    #doSomething
}

正则表达式并不总是最佳选择。

相关问题