Какое было бы лучшее (производительность во время выполнения) приложение или шаблон, или код, или библиотека для сопоставления строковых шаблонов? - PullRequest
0 голосов
/ 09 февраля 2011


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

Самое простое, что существует несколько определенных шаблонов, и мы хотим знать, какой из этих шаблонов полностью или частично соответствует данному запросу. Указанные шаблоны практически не меняются. Количество запросов составляет около 10 КБ в день, но результаты должны предоставляться как можно скорее, и поэтому производительность во время выполнения является наивысшим приоритетом.

Я думал об использовании регулярного выражения скомпилированного ассемблера в C # для этого, но я не уверен, правильно ли я направляюсь.

Сценарий:
Файл данных:
Предположим, что данные предоставляются в виде XML-запроса в известном формате схемы. Он имеет где-нибудь между 5-20 строками данных. В каждом ряду 10-30 столбцов. Каждый из столбцов также может иметь данные только в заранее заданном шаблоне. Например:

  1. A1 - будет "3 цифры", за которыми следует "" следуют "2 цифры" - [0-9] {3}. [0-9] {2}
  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 секунду.

Вопросы:

  1. Есть ли существующий шаблон или чтобы сделать это?
  2. Использует ли Regex правильный путь специально скомпилированная сборка Regex?
  3. Если я в конечном итоге использую Regex, как я могу указать только для шаблонов A1 совпадение со столбцом A1?
  4. Если я укажу расположение правил в битовый тип Как мне обработать ANDS и XOR, когда он становится 100 тысяч символов в длину?

Я ищу любые предложения или варианты, которые я должен рассмотреть.

Спасибо ..

1 Ответ

2 голосов
/ 10 февраля 2011

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

Если бы у вас было это, то вы могли бы сопоставить свои паттерны А1 со столбцом ИИ, столбцы А2 - с паттерном А2 и так далее. Затем сделайте что-нибудь со списком частичных и полных регулярных выражений.

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

Хорошей новостью является то, что стратегия, описанная в http://swtch.com/~rsc/regexp/regexp1.html, должна быть в состоянии реализовать это. В частности, наборы State могут быть расширены, чтобы иметь информацию о вашем текущем состоянии в нескольких шаблонах одновременно. Этот расширенный набор State наборов приведет к более сложной диаграмме состояний (потому что вы отслеживаете больше вещей) и более сложному возвращению в конце (вы возвращаете набор наборов состояний), но время выполнения выиграло ' не должно быть изменено, соответствует ли вам один шаблон или 50.

...