我想解析字符串,以便检查它们是否具有指定的语法。
例子:
Str = Z344-R565l t
这里我的要求是在后面Z
应该有一个数字,然后是 a-
和之后R
应该有一个数字,然后是l
,然后是一个空格,然后是 finally t
。
如果除此之外有任何其他内容,它应该是一个错误。
我必须像这样解析许多不同类型的语法。如果为每种所需的语法类型编写一个函数,我会很尴尬。听说yacc或者lex可以解决这个问题。
任何人都可以对我的问题有所了解吗?
我想解析字符串,以便检查它们是否具有指定的语法。
例子:
Str = Z344-R565l t
这里我的要求是在后面Z
应该有一个数字,然后是 a-
和之后R
应该有一个数字,然后是l
,然后是一个空格,然后是 finally t
。
如果除此之外有任何其他内容,它应该是一个错误。
我必须像这样解析许多不同类型的语法。如果为每种所需的语法类型编写一个函数,我会很尴尬。听说yacc或者lex可以解决这个问题。
任何人都可以对我的问题有所了解吗?
您使用正则表达式执行此操作。
Z344-R565l t
你的正则表达式应该是这样的。不确定用于 c++ 的正则表达式库,但这是确保字符串匹配的通用正则表达式。
Z[0-9]+-R[0-9]+l t
使用 boost::regex
#include <string>
#include <boost/regex.hpp>
bool isMatch(std::string input){
boost::regex r("Z[0-9]*-R[0-9]*l t");
return boost::regex_search(input, r);
}
您可以做的另一件事是在文件中提供一个正则表达式列表,每行一个表达式。使用文件输入创建 boost::regex 对象的向量,并遍历需要验证的每个字符串的模式向量。它不是很有效,但它会起作用。
如果您只想检查语法,则 Boost::Regex 很好。如果您想在阅读这样的表达式时实际做某事,我建议您将 Boost::Spirit 与以下内容一起使用:
rule<> testFormula =
(ch_p('Z') >> int_p)
>> (ch_p('-')>>ch_p('R')>>int_p>>ch_p('l'))
>> space_p >> ch_p('t');
我已经隔离了您可能想要连接到某些操作的表达式部分(使用 [] 运算符)。
有关更多信息,请参阅文档
你可能会谷歌“ runtime parser generation
”或类似的东西......
lex
and yacc
(或它们的 GNU 等价物flex
and bison
)在编译时完成它们的工作,并且可能不够灵活以满足您的需求。(或者他们可能,你不是很具体)。
如果您有最新的编译器(VC 2008 SP1 等),则无需使用 boost,正则表达式是 TR1 的一部分,您可以将它们与以下标头一起使用:#include <regex>
日期示例(您应该使用 double\
作为转义字符):
string dateorder = "12/07/2009";
tr1::regex expr("^([1-2][0-9]|0?[1-9]|30|31)/([1-9]|10|11|12)/(2\\\d{3})$");
if (!regex_match(dateorder.begin(),dateorder.end(),expr))
{
...
break;
}