需要正则表达式来匹配动态确定的重复计数

时间:2011-08-20 05:22:54

标签: ruby regex self-reference

我需要一个ruby regexp模式,它匹配一个包含字母的字符串(为简单起见'a')n次,然后是n。

例如,它应匹配“aaa3”,“aaaa4”等但不匹配“a2”或“aaa1”等。

3 个答案:

答案 0 :(得分:3)

这在正则表达式中是不可能的,因为它不是常规语言(使用Pumping Lemma for Regular Languages很容易证明)。我不确定红宝石正则表达式是多么强大而不是真正的正则表达式,但我怀疑它对此有多强大。您可以对其设置有限限制并说明每种可能性:

a1|aa2|aaa3|aaaa4|aaaaa5||aaaaaa6||aaaaaaa7||aaaaaaaa8||aaaaaaaaa9

由于所有有限的语言都是常规的,但是使用字符串操作来计算字母出现的次数会很容易,然后在该字母的最后一个字符串之后的字符串中解析该整数。

答案 1 :(得分:3)

我可以在Perl中完成,但不能在Ruby中完成。

/^(a+)(??{length($1)})$/

有趣,嗯?

检查出来:http://ideone.com/ShB6C

答案 2 :(得分:1)

我刚刚醒来,所以拿出一粒盐,但不是用一个正则表达式来做,一个简单的方法就是

def f(s)
  s =~ /(a+)(\d)/
  $1.size == $2.to_i
end #=> nil
f 'aaa3' #=> true
f 'aa3' #=> false