我希望在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";
}
最后,我应该始终能够匹配至少一个正则表达式,直到我到达字符串的末尾。
答案 0 :(得分:0)
你有一组名为A..Z的正则表达式。 你得到了一个字符输入流。 您需要将每个正则表达式(A..Z)编译为状态机(a..z)。 然后,您需要将这些单独的状态机组合成一个状态机(最终)。 最终状态机中的每个状态都匹配来自a..z状态机的状态的集合(1个或多个)。 状态机是节点(状态)和边(输入字符)的集合。 例如表达式“ab”匹配具有3个节点的状态机
(空字符串,输入“a”,输入“ab”)
和2个边缘“a”和“b”。
类似于表达“cd”。
当你组合这两个状态机时,你会得到:
(空字符串,输入“a”,输入“ab”,输入“c”,输入“cd”)。
听起来可行吗?