【问题标题】:regular expression to split up searchphrase用于拆分搜索短语的正则表达式
【发布时间】:2009-02-27 15:29:00
【问题描述】:

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

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

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

【问题讨论】:

  • “我知道,我会使用正则表达式。”现在他们有两个问题......
  • “我知道,我会引用关于正则表达式的报价。”现在作者有三个问题,因为没有人告诉他为什么不使用正则表达式! (不是个人亚当,这句话被过度使用了 IMO。)
  • 您还想匹配不以* 开头/结尾的单个单词吗?
  • @Gumbo 那太好了,当我写这个问题时,我没想到一个字。

标签: c++ regex boost


【解决方案1】:

试试这个正则表达式:

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

【讨论】:

  • 很抱歉,您的第一个正则表达式不起作用。它似乎匹配“这是一个“测试字符串””中的每个单词,尽管它应该只匹配“测试字符串”。
  • 我以前有过,但我想他也想匹配这些词。让我们看看 Qwark 怎么说。
  • 今天是星期一早上,我要在工作中测试正则表达式,它确实比我希望的更完美 =),谢谢。
【解决方案2】:

只要没有引用嵌套(嵌套通常是正则表达式不擅长的):

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 2014-03-02
    相关资源
    最近更新 更多