2

我想解析字符串,以便检查它们是否具有指定的语法。

例子:

Str = Z344-R565l t

这里我的要求是在后面Z应该有一个数字,然后是 a-和之后R应该有一个数字,然后是l,然后是一个空格,然后是 finally t

如果除此之外有任何其他内容,它应该是一个错误。

我必须像这样解析许多不同类型的语法。如果为每种所需的语法类型编写一个函数,我会很尴尬。听说yacc或者lex可以解决这个问题。

任何人都可以对我的问题有所了解吗?

4

5 回答 5

6

您使用正则表达式执行此操作。

Z344-R565l t

你的正则表达式应该是这样的。不确定用于 c++ 的正则表达式库,但这是确保字符串匹配的通用正则表达式。

Z[0-9]+-R[0-9]+l t
于 2009-02-18T04:02:52.467 回答
4

使用 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 对象的向量,并遍历需要验证的每个字符串的模式向量。它不是很有效,但它会起作用。

于 2009-02-18T05:08:08.207 回答
4

如果您只想检查语法,则 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');

我已经隔离了您可能想要连接到某些操作的表达式部分(使用 [] 运算符)。

有关更多信息,请参阅文档

于 2009-02-18T06:00:54.073 回答
1

你可能会谷歌“ runtime parser generation”或类似的东西......

lexand yacc(或它们的 GNU 等价物flexand bison)在编译时完成它们的工作,并且可能不够灵活以满足您的需求。(或者他们可能,你不是很具体)。

于 2009-02-18T03:51:01.047 回答
1

如果您有最新的编译器(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;  
}
于 2009-07-22T13:10:27.690 回答