1

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

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

4

3 回答 3

4

我可以在 Perl 中做到这一点,但在 Ruby 中不行。

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

好玩,嗯?

看看:http: //ideone.com/ShB6C

于 2011-08-20T06:03:20.660 回答
3

这在正则表达式中是不可能的,因为它不是常规语言(这很容易用Pumping Lemma for Regular Languages证明)。我不确定 ruby​​ 正则表达式比真正的正则表达式强大多少,但我怀疑它是否足够强大。您可以对其设置有限限制并说明每种可能性,例如:

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

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

于 2011-08-20T05:26:33.287 回答
1

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

def f(s)
  s =~ /(a+)(\d)/
  $1.size == $2.to_i
end #=> nil
f 'aaa3' #=> true
f 'aa3' #=> false
于 2011-08-20T08:20:51.220 回答