В какой-то момент в моем приложении мне нужно сопоставить некоторые строки с шаблоном. Предположим, что некоторые из строк примера выглядят следующим образом:Поиск соответствия строки шаблону
- Привет, Джон.
- Какой прекрасный день сегодня!
- Прекрасный закат сегодня, Джон, не так ли?
- Будете ли вы встречаться с Линдой сегодня, Джон?
Большинство (не все) эти строки из предопределенных шаблонов следующим образом:
- "Привет,% S".
- «Какой прекрасный день сегодня!»
- «Прекрасный закат сегодня,% s, не так ли?»
- «Встречаете ли вы% s сегодня,% s?»
Эта библиотека шаблонов постоянно расширяется (в настоящее время составляет около 1500), но поддерживается вручную. Входные строки, хотя (первая группа), в значительной степени непредсказуемы. Хотя большинство из них будет соответствовать одному из шаблонов, некоторые из них не будут.
Итак, вот мой вопрос: для ввода строки (из первой группы) в качестве ввода мне нужно знать, какой из шаблонов (известная вторая группа) соответствует. Если ничего не сопоставимо, мне нужно это мне сказать.
Я предполагаю, что решение включает в себя создание регулярного выражения из шаблонов и итеративную проверку соответствия. Однако я не уверен, как выглядит код для создания этих регулярных выражений.
Примечание: строки, приведенные здесь, приведены для иллюстрации. На самом деле строки не генерируются человеком, а представляют собой генерируемые компьютером человеческие строки, как показано выше, из систем, которые я не контролирую. Поскольку они не вводятся вручную, нам не нужно беспокоиться о таких вещах, как опечатки и другие человеческие ошибки. Просто нужно найти, какой шаблон он соответствует.
Примечание 2: Я мог бы изменить библиотеку шаблонов, чтобы быть каким-то другим форматом, если это упрощает конструкцию регулярных выражений. Текущая структура с типом printf% s не установлена в виде камня.
Какова запрашиваемая производительность? Регулярное выражение на 1500 струнах не могло быть самым быстрым на Земле ... Вы могли бы начать с математики некоторых символов, возможно, только с первого (исключая пробелы), а затем переходя к регулярному выражению. – lunadir
@ lunadir Спектакль должен быть первоклассным. Я должен обрабатывать около 6000 таких строк в секунду, но я могу использовать несколько процессов. Я не мог решить проблему, потому что раньше я хотел иметь рабочее решение с голыми костями. –
@ lunadir Кроме того, это не должно быть одно регулярное выражение. Это может быть 1500 различных регулярных выражений вместе с некоторыми операторами if/else, работающими внутри заранее созданной функции (созданной из 'new Function') в JS, если это помогает повысить производительность. –