Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Регулярное выражение со списком "включить" и списком "исключить"

Автор вопроса: metaopolyОтветов: 1

У меня есть предложение (слова, разделенные пробелами).

Затем у меня есть два списка фраз (полные или частичные слова, т. е. не содержащие пробелов): один - список "включить", а другой - список "исключить".

Соответствующее предложение будет содержать все фразы из списка "включить" (перекрытия допустимы, регистр не учитывается) и ни одну фразу из списка "исключить".

Как проверить, соответствует ли предложение правилам? Спасибо.

Пример

Предложение = This yammy Flybe catalog is sticky

Включить список = cat fly tic

Список исключений = veg pot yam

Тест не пройден, потому что, несмотря на то, что в предложении присутствуют все фразы "включить", одна из фраз "исключить" (yam) все же присутствует. Измените слово yammy на yummy, и тест должен пройти.

P.S. в настоящее время для этого используется реализация разделения отношений в SQL, которая кажется хорошо оптимизированной, когда данные уже находятся в базе данных SQL. Теперь у меня есть структура данных, поступающая из внешнего источника. Я полагаю, что мог бы передать строки с разделителями, разделить на строки таблицы и т. д., но я хочу изучить другие варианты. Итак, если не регулярное выражение, то что?

  • Я предлагаю для добавленного нового вопроса открыть отдельный вопрос (убедитесь, что он не слишком похож на дубликат), где вы явно запрашиваете другие подходы, чем тот, который представлен в этой теме. Маловероятно, что люди найдут новые вопросы, добавленные во время редактирования... Кстати, ваш пример превосходен и работает с предложенным решением. Abel 10.12.2009

regexvbscriptlanguage-agnostic

Ответы

Ответ 1 · рейтинг 5 · Abel

Хотя я думаю, что с регулярными выражениями это делать не очень хорошо, вы можете рассмотреть что-то в этом роде (негативное упреждение и положительное упреждение, закрепленное в начале), когда регулярные выражения являются вашей предпочтительной технологией:

^(?=.*include1)(?=.*include2)(?=.*...)(?!.*(?:exclude1|exclude2|...))

Обязательно используйте Regex.Escape в отдельных предложениях, прежде чем добавлять их в выражение включения или исключения. Регулярное выражение работает следующим образом:

  • Если в совпадающей строке есть include1, то это удается, если нет, то не удается и
  • Если в совпадающей строке есть include2, то это удается, если нет, то не удается и
  • Если в совпадающей строке есть includeX, то это удается, если нет, то не удается и
  • Если exclude1 находится в соответствующей строке, происходит сбой или
  • Если exclude2 находится в соответствующей строке, происходит сбой или
  • Если excludeX находится в соответствующей строке, происходит сбой.

Другими словами: все включаемые предложения должны быть в (в любом порядке), все исключающие предложения должны быть в отсутствующих.

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

Обновление: исправлена ​​ошибка в коде и добавлено объяснение.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы