регулярное выражение для разбиения поисковой фразы - PullRequest
1 голос
/ 27 февраля 2009

Я надеялся, что кто-нибудь может помочь мне написать регулярное выражение для c ++, которое сопоставляет слова в поисковой фразе, и объяснить его по крупицам для целей обучения.

Мне нужно регулярное выражение, соответствующее строке в " " как "Hello you all", и отдельные слова, которые начинаются / заканчиваются * как *ack / overfl*.

Для части цитаты у меня есть \"[\^\\s][\^\"]*\", но я не могу понять часть подстановочного знака (*), и как я должен объединить ее с регулярным выражением цитаты.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2009

Попробуйте это регулярное выражение:

(?:\*?\w+\*?|"(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*")+

Для удобства чтения я заменил символы обратной косой черты на \x5C.

Выражение "(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*" также будет соответствовать "foo \"bar\"" и другим надлежащим образом экранированным последовательностям кавычек (но может быть экранирован только ").

Итак, foo* bar *baz *quux* "foo \"bar\"" следует разделить на:

  • foo*
  • bar
  • *baz
  • *quux*
  • "foo \"bar\""

Если вы не хотите совпадать с bar в примере выше, используйте это:

(?:\*\w+|\w+\*|"(?:[^\x5C"]+|\x5C(?:\x5C\x5C)*")*")+
0 голосов
/ 27 февраля 2009

До тех пор, пока нет вложенных кавычек (в целом, регулярное выражение - это плохо для регулярных выражений):

"(?:(?<=\\)"|[^"])*"|\*[^\s]+|[^\s]+\*

Это регулярное выражение допускает экранированные двойные кавычки ('\"'), хотя, если вам это нужно. И матч включает в себя двойные кавычки.

Это регулярное выражение соответствует:

  • "A string in quotes, possibly containing \"escaped quotes\""
  • *a_search_word_beginning_with_a_star
  • a_search_word_ending_with_a_star*
  • *a_search_word_enclosed_in_stars*

Имейте в виду , что он будет разрываться на такие строки:

  • A broken \"string "with the quotes all \"mangled up\""

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

Для проверки / парсинга пользовательского ввода его нельзя использовать. Вот где я бы порекомендовал парсер. Знать разницу - вот ключ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...