基本上,这就是我想要做的事情:
if ($expression =~ /^\d{num}\w{num}$/)
{
#doSomething
}
其中num
不是标识符,但可以代表任何大于0的整数(\d
和\w
被任意选择)。我希望匹配一个字符串,如果它包含两组相关字符,一组紧跟另一组,并且每组中的字符数相同。
对于此示例,123abc
和021202abcdef
会匹配,但43abc
不会,12ab3c
或1234acbcde
也不匹配。
答案 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
}
正则表达式并不总是最佳选择。