Я пытался найти достойный способ сопоставления строковых паттернов. Я сделаю все возможное, чтобы предоставить как можно больше информации о том, что я пытаюсь сделать.
Самое простое, что существует несколько определенных шаблонов, и мы хотим знать, какой из этих шаблонов полностью или частично соответствует данному запросу. Указанные шаблоны практически не меняются. Количество запросов составляет около 10 КБ в день, но результаты должны предоставляться как можно скорее, и поэтому производительность во время выполнения является наивысшим приоритетом.
Я думал об использовании регулярного выражения скомпилированного ассемблера в C # для этого, но я не уверен, правильно ли я направляюсь.
Сценарий:
Файл данных:
Предположим, что данные предоставляются в виде XML-запроса в известном формате схемы. Он имеет где-нибудь между 5-20 строками данных. В каждом ряду 10-30 столбцов. Каждый из столбцов также может иметь данные только в заранее заданном шаблоне. Например:
- A1 - будет "3 цифры", за которыми следует
"" следуют "2 цифры" -
[0-9] {3}. [0-9] {2}
A2- Будет "1
персонаж "вслед за" цифрами "-
[A-Z] [0-9] {4} * * 1016
Пример будет выглядеть примерно так:
<Data>
<R1>
<A1>123.45</A1>
<A2>A5567</A2>
<A4>456EV</A4>
<An>xxx</An>
</R1>
</Data>
Файл правила:
Rule ID A1 A2
1001 [0-9]{3}.45 A55[0-8]{2}
2002 12[0-9].55 [X-Z][0-9]{4}
3055 [0-9]{3}.45 [X-Z][0-9]{4}
Расположение правила - я планирую хранить идентификаторы правил в некоторой битовой маске.
Таким образом, идентификаторы правил будут перечислены как местоположение в строке
Rule ID Location (from left to right)
1001 1
2002 2
3055 3
Файл шаблона: (Это не окончательная структура, а просто мысль)
Column Pattern Rule Location
A1 [0-9]{3}.45 101
A1 12[0-9].55 010
A2 A55[0-8]{2} 100
A2 [X-Z][0-9]{4} 011
Теперь давайте предположим, что НЕКОТОРЫЕ (не знаю, как я собираюсь ограничить поиск, чтобы сэкономить время) Я запустил регулярное выражение и убедился, что столбец A1 соответствует только шаблонам aginst A1 и столбцу A2 для A2 узоры. Я бы закончил со следующими результатами для "Расположение правила"
Column Pattern Rule Location
A1 [0-9]{3}.45 101
A2 A55[0-8]{2} 100
- Выполнение И на каждом из замков
дает мне местоположение 1 - 1001 -
Завершите матч.
- Делать XOR на каждом из лосьонов
дает мне местоположение 3 - 3055 -
Частичное совпадение. (Я нарочно не
делать ИЛИ, потому что это будет иметь
вернул 1001 и 3055 в результате
что было бы неправильно для частичного
матч)
Последние результаты, которые я ищу:
1001 - полный матч
3055 - Частичное совпадение
Запустить Edit_1: Объяснение результатов сопоставления
- Complete Match - это происходит, когда все
шаблонов в данном правиле
соответствует.
Частичное совпадение - это происходит, когда НЕ
все шаблоны в данном правиле
соответствует, но по крайней мере один шаблон
спички.
Пример полного соответствия (AND):
Правило ID 1001 подходит для A1 (101) и A2 (100). Если вы посмотрите на первый символ в 101 и 100, это «1». Когда вы делаете AND - 1 и 1, результат равен 1. Таким образом, позиция 1, т. Е. 1001, является полным совпадением.
Пример частичного совпадения (XOR):
Правило ID 3055 соответствует A1 (101). Если вы посмотрите на последний символ в 101 и 100, это «1» и «0». Когда вы делаете XOR - 1 XOR 0, результат равен 1. Таким образом, позиция 3, то есть 3055, является частичным совпадением.
Конец Edit_1
Введите:
Данные будут предоставлены в виде своего рода XML-запроса. Это может быть один большой запрос с узлами данных 100 КБ или 100 000 запросов только с одним узлом данных.
Правила:
Соответствующие значения должны быть изначально сохранены как своего рода шаблон, чтобы было легче писать и редактировать. Давайте предположим, что существует приблизительно 100 000 правил.
Выход:
Необходимо знать, какие правила соответствуют полностью и частично.
Параметры:
Я бы предпочел делать как можно больше кодирования в C #. Однако, если есть значительное повышение производительности, я могу использовать другой язык.
«Вход» и «Вывод» - мои требования, как мне удается получить «Вывод», не имеет значения. Это должно быть быстро, скажем, каждый узел данных должен быть обработан примерно за 1 секунду.
Вопросы:
- Есть ли существующий шаблон или
чтобы сделать это?
- Использует ли Regex правильный путь
специально скомпилированная сборка
Regex?
- Если я в конечном итоге использую Regex, как я могу
указать только для шаблонов A1
совпадение со столбцом A1?
- Если я укажу расположение правил в
битовый тип Как мне обработать
ANDS и XOR, когда он становится
100 тысяч символов в длину?
Я ищу любые предложения или варианты, которые я должен рассмотреть.
Спасибо ..