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

Под капотом события являются просто делегатами со специальными соглашениями о вызовах. (Например, Вы не должны проверять на ничтожность прежде, чем сгенерировать событие.)

В псевдокоде, Событии. Вызовите (), ломается как это:

, Если Событие Сделало, чтобы Слушатели Позвонили каждому слушателю синхронно на этом потоке в произвольном порядке.

события Since многоадресно передаются, у них будут нуль или больше слушателей, сохраненных в наборе. CLR циклично выполнится через них, называя каждого в произвольном порядке.

Один большой протест помнить состоит в том, что обработчики событий выполняются в том же потоке, как событие генерируется в. Это - общая умственная ошибка думать о них как о порождении нового потока. Они не делают.

13
задан gmuller 3 November 2009 в 14:08
поделиться

7 ответов

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

Рассмотрим следующие выражения:

AB[A-Z0-9]{1,10}1234

AB.*1234

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

7
ответ дан 1 December 2019 в 21:52
поделиться

Для некоторых простых регулярных выражений, подобных указанному вами (AB [CD] 1234), существует ограниченный набор совпадений. Но для других выражений (AB [CD] * 1234) количество возможных совпадений не ограничено.

Один из методов поиска всех возможных вариантов - это определить, где в регулярном выражении есть варианты. Для каждого возможного варианта сгенерируйте новое регулярное выражение на основе исходного регулярного выражения и текущего выбора. Это новое регулярное выражение теперь немного проще исходного.

Для такого выражения, как «A [BC] [DE] F», метод будет действовать следующим образом

getAllMatches("A[BC][DE]F")
= getAllMatches("AB[DE]F") + getAllMatches("AC[DE]F")
= getAllMatches("ABDF") + getAllMatches("ABEF") 
   + getAllMatches("ACDF")+ getAllMatches("ACEF")
= "ABDF" + "ABEF" + "ACDF" + "ACEF"
3
ответ дан 1 December 2019 в 21:52
поделиться

Регулярное выражение предназначено только для сопоставления с шаблоном, то есть регулярное выражение никогда ничего не «перечислит», а только сопоставит. Если вы хотите получить список всех совпадений, я думаю, вам нужно будет сделать это самостоятельно.

1
ответ дан 1 December 2019 в 21:52
поделиться

Что ж, вы могли бы преобразовать регулярное выражение в эквивалентный конечный автомат (это относительно просто и может быть выполнено алгоритмически), а затем рекурсивно проследить каждый возможный путь через эту fsm, выводя пройденные пути через машина. Это не очень сложно и не требует много ресурсов компьютера для каждого вывода (однако обычно вы получаете ОГРОМНЫЙ объем вывода). Однако вы должны позаботиться о том, чтобы запретить потенциально бесконечные проходы (например, . * ). Это можно сделать, задав максимально допустимую длину пути, после чего трассировка прерывается

2
ответ дан 1 December 2019 в 21:52
поделиться

Невозможно.

Действительно.

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

1
ответ дан 1 December 2019 в 21:52
поделиться

Возможно, удастся найти какой-нибудь код для перечисления всех возможных совпадений для чего-то столь же простого, как вы делаете. Но для большинства регулярных выражений вы даже не захотите пытаться перечислить все возможные совпадения.

Например, AB. * 1234 будет AB, за которым следует абсолютно что угодно, а затем 1234.

0
ответ дан 1 December 2019 в 21:52
поделиться

Я не совсем уверен, что это вообще возможно, но если бы это было так, во многих ситуациях потребовалось бы столько ресурсов процессора / времени, что это было бы бесполезно.

Например, попробуйте составить список всех совпадений для A. * Z

Однако есть сайты, которые помогают создать хорошее регулярное выражение:

0
ответ дан 1 December 2019 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: