2015-05-19 5 views
1

Пользователь может определить формат идентификатора в моей системе, и это сохраняется в d/b как строка регулярного выражения (например, «/^\d{6}$/» или более сложная пример «/^[A-Z]{2}\d{8}$/»).Вычислить максимальную длину строки вывода регулярного выражения

Может ли кто-нибудь предложить, как я могу вычислить максимальную длину строки, которую может соответствовать заданное регулярное выражение (спасибо @Ulver)?

Большое спасибо за чтение!

+0

Какова должна быть максимальная длина '. *'? – anubhava

+0

Вы хотите, чтобы вычислить максимальную длину строки, которую может соответствовать заданное регулярное выражение? – Ulver

+0

Возможно, вы хотели бы взглянуть на [Генерировать строки, основанные на регулярных выражениях с Hoa \ Regex] (http://mnt.io/P/2014-09-30_Generate_strings_based_on_regular_expressions.html), а затем проверить длину генерируемых строк , [Ссылка на библиотеку Hoa] (https://github.com/hoaproject/Regex/) –

ответ

1

Этот ответ подразумевает 5 вещей:

  1. выражения просты, в соответствии с вашими примерами.
  2. У вас нет * или + Операторы в вашем выражении.
  3. У вас нет картинок для отображения foo{n, }, где n - некоторое положительное целое значение.
  4. Каждое выражение начинается с ^ и заканчивается $.
  5. Я также предполагаю, что за каждым термином следует количество раз, которое вы ожидаете от него.

Чтобы вычислить количество символов они совпадают, то вы могли бы пройти через выражение и искать 2 моделей:

  1. {n}, который переводит, чтобы соответствовать точно n раз. В этом случае извлечение n.
  2. {n, m}, что соответствует не менее чем n раз, и не более m раз. В этом случае извлечение m.

После этого у вас будут все значения n и m, вы просто добавили их вместе.


Некоторые подробности о предположениях:

  1. Как выражения становятся более сложными, вам нужно будет следить за различных персонажей. Например, ^[A-Z]{2}$ означает совпадение 2 строчных букв. Таким образом, длина совпадения будет равна 2. С другой стороны, foo{2} означает fooo. Но также будут сопоставлены afooo и foooobar. Таким образом, вы не контролируете длину шаблона. также (abc){2} означает совпадение abc дважды, таким образом, в этом случае вам нужно будет умножить значение n (значение в фигурных скобках) с длиной того, что когда-либо находится в скобках, которые предшествуют ему, если таковые имеются. Конечно, у вас могут быть вложенные значения.

  2. Операторы * и + обозначают 0 или более и 1 или более соответственно. Таким образом, теоретически нет ограничений на длину того, что оно сопоставляется.

  3. Как указано в пункте 2, {n,} означает совпадение как минимум n раз. Таким образом, верхнего предела нет.

  4. Как и в случае с пунктом 1, без привязки к ^ и $, выражение может соответствовать любой строке. Выражение foo может соответствовать afoo, foobar, foooooooooooooooooooooooo и так далее.

  5. Я принял это предположение по причинам, сходным с пунктом 1. Вы могли бы улучшить ваше приложение, чтобы искать пары [] и считать их 1 символом, но я думаю, что у вас могут быть другие оговорки.

+0

tl; dr Проанализируйте регулярное выражение. – nhahtdh

+0

@nhahtdh: Если вам требуется комплексное решение, которое предоставленный ответ не распространяется, да. В этом случае, может ли Бог помиловать вашу душу ... – npinti