C ++中的正则表达式?

时间:2014-03-06 15:14:52

标签: c++ regex stl

我希望在C ++ / STL中构建一个简单的类似flex的分析器。

为此,我想从左到右扫描一个字符串,每次都在一组正则表达式中提取最大可能的正则表达式。

我不太清楚该怎么做。问题实际上并不是编译正则表达式或使用它们,但我不确定提取最长正则表达式的“更高级别”循环需要是什么样的。

任何提示都会很好。它不一定是显式代码,而只是一些指针和想法。

编辑:感谢指向增强正则表达式库的指针。我不知道。

以下是提取电子邮件地址的示例代码:

  std::string html = …;
  regex mailto("<a href=\"mailto:(.*?)\">", regex_constants::icase);
  sregex_iterator begin(html.begin(), html.end(), mailto), end;

  for (; begin != end; ++begin)
  {
       smatch const & what = *begin;
       std::cout << "Email address to spam: " << what[1] << "\n";
  }

我想要的是略有不同。

例如,我希望有一个额外的正则表达式,它可以找到http://地址,也可以查找所有大写字符串。

  std::string html = …;
  regex mailto("<a href=\"mailto:(.*?)\">", regex_constants::icase);
  regex http( .... );
  regex all_caps("...", regex_constants::icase);
  // the actual definitions of the regular expressions do not matter, I can find how to do that later.


  // Here, I would like to iterate, and find concurrently the matching patterns from all three regular expressions above
  sregex_iterator begin(html.begin(), html.end(), mailto), end;

  for (; begin != end; ++begin)
  {
       smatch const & what = *begin;
       // here I should be able to identify which among the above three was found
       std::cout << "Email address to spam: " << what[1] << "\n";
  }

最后,我应该始终能够匹配至少一个正则表达式,直到我到达字符串的末尾。

1 个答案:

答案 0 :(得分:0)

你有一组名为A..Z的正则表达式。 你得到了一个字符输入流。 您需要将每个正则表达式(A..Z)编译为状态机(a..z)。 然后,您需要将这些单独的状态机组合成一个状态机(最终)。 最终状态机中的每个状态都匹配来自a..z状态机的状态的集合(1个或多个)。 状态机是节点(状态)和边(输入字符)的集合。 例如表达式“ab”匹配具有3个节点的状态机

(空字符串,输入“a”,输入“ab”)

和2个边缘“a”和“b”。

类似于表达“cd”。

当你组合这两个状态机时,你会得到:

(空字符串,输入“a”,输入“ab”,输入“c”,输入“cd”)。

听起来可行吗?