Требуется регулярное выражение для соответствия динамически определенному количеству повторений - PullRequest
1 голос
/ 20 августа 2011

Мне нужен шаблон ruby ​​regexp, который соответствует строке, содержащей букву (для простоты скажем 'a') n раз и затем n в конце.

Например, он должен соответствовать "aaa3"aaaa4 "и т. д., но не" a2 "или" aaa1 "и т. д.

Ответы [ 3 ]

3 голосов
/ 20 августа 2011

Я могу сделать это в Perl, но не в Ruby.

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

Весело, а?

Проверьте это: http://ideone.com/ShB6C

3 голосов
/ 20 августа 2011

Это невозможно в регулярных выражениях, поскольку это не обычный язык (это легко доказать с помощью Насосная лемма для регулярных языков ). Я не уверен, насколько мощнее регулярное выражение в ruby, чем настоящее регулярное выражение, но я сомневаюсь, что оно достаточно мощное для этого. Вы можете установить конечный предел и указать каждую возможность, например:

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

Поскольку все конечные языки являются регулярными, но было бы намного проще использовать строковые операции для подсчета числа раз, когда появляется буква, а затем анализировать это целое число в строке сразу после последней из этой буквы.

1 голос
/ 20 августа 2011

Я только что проснулся, так что возьми это с крошкой соли, но вместо того, чтобы делать это с одним регулярным выражением, простой способ сделать это будет

def f(s)
  s =~ /(a+)(\d)/
  $1.size == $2.to_i
end #=> nil
f 'aaa3' #=> true
f 'aa3' #=> false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...