Алгоритм регулярных выражений для целочисленных списков - PullRequest
2 голосов
/ 15 июля 2010

Обычно регулярное выражение работает для кода ASCII. Скажите «abbbd» .match («ab * d»).

Интересно, существуют ли алгоритмы или инструменты, позволяющие пользователю сопоставлять регулярные выражения? для целочисленных списков.

например:

int[] a = {1,2,2,2,2,5}; 
a.match("12*5"); 

Большое спасибо.

Ответы [ 4 ]

1 голос
/ 15 июля 2010

Я делал что-то подобное раньше, хотя мне пришлось написать собственный движок для этого. В ASCII (или в Юникоде, или в любом другом наборе символов) нет ничего волшебного, и когда в школе учат регулярным выражениям , они обычно используют крошечный набор произвольных символов (например, Σ = {a, b}) для сохранения все просто. Алгоритмы все еще работают одинаково.

Большинство функций движков регулярных выражений в стиле Perl относятся только к персонажам. Некоторые функции, такие как ^ и $, по-прежнему работают нормально. Некоторые как [:alnum:] не имеют никакого смысла вообще. И другие, такие как [3-5], могут быть адаптированы для работы с не символьными строками.

Один хитрый момент (уже отмеченный полигенными смазочными материалами и другими) заключается в том, что регулярные выражения Perl работают хорошо, потому что то, что вы используете для описания языка, и то, что вы сопоставляете, - это обе строки символов - синтаксис не ' почти не работает для алфавитов без символьных строк. Так что /[3-5]/ в символах, возможно, должно быть [3,4,5] (список целых чисел), и поэтому вам нужно строить язык из выражений, а не из строк (если вы не хотите писать свой собственный анализатор!).

Почему большинство библиотек регулярных выражений не являются общими для алфавита? Beats me - это чрезвычайно полезный инструмент, и кажется ужасной тратой применять его только к строкам персонажей. LINQ хорош, но я не уверен, как это могло бы помочь здесь.

0 голосов
/ 15 июля 2010

Вы можете использовать что-то вроде marge (), где marge просто создаст последовательность строк / символов, имеющую всех членов массива-

a.marge().match("12*5");
0 голосов
/ 15 июля 2010
int[] a = {1,2,2,2,2,5}; 
a.match("12*5"); 

Предположим, что вы пытаетесь сопоставить "122225" с регулярным выражением "12 * 5". Генерация строки с использованием snprintf в C / C ++ или .toString () в Java и т. Д. Должна быть чистой и простой.

Не рекомендуем вам получать специальный алгоритм или инструмент для этого.

0 голосов
/ 15 июля 2010

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

{1, 2, 2, 2, 2, 5}

или это:

{12, ..., 5}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...