正则表达式以分割搜索短语

时间:2009-02-27 15:29:00

标签: c++ regex boost

我希望有人能帮助我编写一个与搜索词组中的单词匹配的c ++正则表达式,并为学习目的一点一点地解释它。

我需要的是一个匹配" "内的字符串的正则结构,如"Hello you all",以及*开头/结尾的单个字,例如*ack / overfl*

对于引用部分我有\"[\^\\s][\^\"]*\"但我无法弄清楚通配符(*)部分,以及我应该如何将它与引用正则表达式结合起来。

2 个答案:

答案 0 :(得分:0)

只要没有引用嵌套(一般情况下嵌套是正则表达式不好的地方):

"(?:(?<=\\)"|[^"])*"|\*[^\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\""

如果您希望(阅读:不能完全排除的可能性)来获取这些,请不要使用正则表达式,而是编写一个小的引用感知解析器。对于一次性搜索和替换保证格式的活动或输入,正则表达式可以使用。

为了验证/解析用户输入,不能使用。这就是我推荐解析器的地方。了解差异是关键。

答案 1 :(得分:0)

试试这个正则表达式:

(?:\*?\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)*")*")+