Как искать шаблоны в произвольных последовательностях?
Regex используется только в строке, но что, если эта функциональность может быть расширена не только на символ, но и на объекты или даже дальше на функции? Предположим, что наши объекты будут целыми числами, они могут быть в любом порядке:
1 2 3 4 5 6 7 8 9 10 11 12 13
И задача, которую вы хотите решить, это найтипростые пары (или аналогичная задача поиска по шаблону) вот так:
{prime}{anyNumber}{prime}
Так что ответ таков:
(3,4,5) (5,6,7) (11,12,13)
Или немного более сложный пример для цепочки простых чисел:
{prime}({anyNumber}{prime})+
Ответ:
(3,(4,5),(6,7)) (11,(12,13))
Очень похоже на работу Regex, верно?
Что происходит, что вы определяете некоторую функцию с именемIsPrime (х) и использовать его, когда вам нужно проверить, является ли следующий элемент ввода действительно простым (так что это своего рода равенство объекту или пространству объекта)
Что я создал до сих пор
я создалObjectRegex класс похож наRegex класс в C #. Он принимает шаблоны, указанные выше, и выполняет связанный с ним предикат для идентификации объекта. Он прекрасно работает, но проблема в том, что он работает с любой последовательностью типаTValue следует преобразовать встрока прежде чем он будет передан в шаблон Regex и для этого я должен применить ВСЕ предикаты ко всей последовательности. O (n * m) плохая идея в конце концов ....
Я решил обойти это трудным путем и .... попытаться унаследовать строку, которая запечатана и наследование запрещено. От этого унаследованного класса требуется переопределение доступа
char this[int index] {get;}
в пользу отложенного выполнения предикатов до момента, когда это действительно имеет смысл.
Итак, есть идеи, как это сделать? Я люблю .NET Regex и его синтаксис, есть ли способ обойти это строковое проклятие и обмануть движок? Отражение может быть или какой-то хардкор я не знаю?
Обновление 1
Я нашел эту статьюhttp://www.codeproject.com/Articles/463508/NET-CLR-Injection-Modify-IL-Code-during-Run-time и думаю, что это можно сделать путем замены этого метода [int index] моим кодом, но я думаю, что это повредит все остальное, потому что вы просто не можете заменить метод только для одного экземпляра.