2010-05-28 3 views
1

Можно создать дубликат:
Regular Expressions: Is there an AND operator?Пусть регулярное выражение игнорирует порядок поисковых терминов

Я позволил своим пользователям ввести слово для поиска: «Foo бар».

Я хотел бы, чтобы преобразовать запрос пользователя в строку, которая соответствует слова, но игнорируя приказ:

bla foo bla bar = match 
    ^^^  ^^^ 
bla bar bla foo = match (order = reversed) 
    ^^^  ^^^ 
bla bla bla foo = no match (only one word) 
      ^^^ 
bar bla bla bla = no match (only one word) 
^^^ 

Примечание: пример содержит 2 слова, но мои пользователи будут идти дикой природы, и будет введите больше слов.

Если заказ не следует игнорировать, это просто: замените пробелы на «. *», И у меня очень хорошее совпадение.

Но как я могу позволить регулярному выражению игнорировать порядок и по-прежнему соответствовать обоим (или более) словам?

Нужно ли генерировать регулярное выражение, которое будет соответствовать возможным комбинациям порядка?

ответ

1

Я рекомендую смешанный подход. Сохраните условия поиска, | -сепаратированный, в переменной $ search. Затем найдите /(?:$search) ... (?:$search)/g, где (?: $ Search) повторяется несколько раз, равное количеству поисковых терминов.

Если это соответствует, разделите его на термины, сортируйте и проверьте на повторы. Если их нет, это соответствует; если есть повторы, переходите к следующему.

Какой язык .NET вы используете? Мы можем предоставить образец кода.

1

Когда порядок не имеет значения, это в основном ряд отдельных запросов, не так ли? Можете ли вы просто выполнить 1 поиск по каждому слову и только вернуть результаты, где все поисковые запросы будут успешными?

+0

Это был план B. Использование единого регулярного выражения потребовало меньше рефакторинга, и я ленив сегодня. – GvS

Смежные вопросы