Регулярное выражение для соответствия числу, за которым следует символ, повторяющийся много раз?

Как создать RegEx, который может соответствовать следующему:

a3bbb
aaaa3bbb
a4bbbb
aaa5bbbbb

Ie, a (один или несколько раз), затем неотрицательное число, затем b повторяется "столько раз" (столько же, сколько число между a и b).

Является ли этот язык регулярным? Если нет, можем ли мы построить для этого CFG?

Изменить: что касается числа, то я бы сказал, нет. (также, как указывает Даниэль Центоре и Ричи, язык даже не CF. Тогда естественный вопрос: он контекстно-зависимый или неограниченный?)

Ответы

Ответ 1

Как и другие ответы, если число неограничено, язык не является регулярным (если он является регулярным, то, как сказано в лемме о перекачке для достаточно длинной строки, b может быть неограниченно расширено от числа) (если это контекстно-свободная, то, говоря о перекачке, для достаточно длинного числа число и b можно было бы повторить, но не правильно).

Но язык контекстно-зависим, поскольку он может быть сгенерирован с использованием следующей грамматики (я делаю это для номера базы-3 для простоты, вы можете перейти на базу 10):

(1) S -> aS | aB
(2) B -> BN | N
(3) aN -> a0 | a1b | a2bb
(4) 0N -> 00 | 01b | 02bb
(5) 1N -> 10 | 11b | 12bb
(6) 2N -> 20 | 21b | 22bb
(7) bN -> WN
(8) WN -> WX
(9) WX -> NX
(10)NX -> Nbbb

Правило (1) состоит в том, чтобы сгенерировать a s

Правило (2) должно генерировать каждую цифру в числе

Правило (3) - (6) заключается в замене самого левого N на число и соответствующее число b.

Правило (7) - (10) должно иметь N "потреблять" b слева от него и производить 3 b (10 b в базе-10). Технически (7) - (10) просто bN -> Nbbb.

Пример:

To generate: a102bbbbbbbbbbb (102 in base-3 = 11 in base-10)
S
aB (1b)
aBN (2a)
aBNN (2a)
aNNN (2b)
a1bNN (3b)
a1NbbbN (7)-(10)
a1NbbNbbb (7)-(10)
a1NbNbbbbbb (7)-(10)
a1NNbbbbbbbbb (7)-(10)
a10Nbbbbbbbbb (5a)
a102bbbbbbbbbbb (4c)

Ответ 2

Этот язык не является регулярным (и поэтому не может быть выражен как RegEx). Один тест на регулярность языка - проверить, может ли он быть выражен конечным автоматом. Можно показать, что этот язык не может быть выражен как FA, потому что FA потребуется по крайней мере столько же состояний, сколько число между a и b, но это число не ограничено. Однако, если он ограничен (например, число может быть только от 1 до 10), то оно будет регулярным.

Язык также не может быть выражен как CFG, который, вероятно, может быть показан с использованием леммы о перекачке.

Ответ 3

Если число является одной цифрой, тогда язык является регулярным (потому что вы можете просто перечислить девять возможных суффиксов). Но если число не ограничено, язык не является регулярным. Это даже не контекстно-бесплатно. Таким образом, не существует регулярного выражения или CFG.