如何使用拼写错误读取格式化数据?

时间:2018-02-08 00:58:40

标签: c++ string fstream

已经有几个线程处理读取格式化的字符串,但我的问题是我的文本文件偶尔会出现错别字。以下是我的大多数字符串的示例:

Par(custom)1929;

我遇到的问题是某些字符串看起来像这样:

Par({custom)1929:

我想知道如何识别不遵循正确格式的字符串,我会抛出错误。我无法找到一个可靠的方法来搜索字符串并找到错别字。

编辑:

以下是我使用的示例代码,字符串中没有拼写错误。这将获得中间词" custom"如果字符串中没有拼写错误。字是字符串。 com.fi是我存储信息的数据元素。

int left = word.find("(");
int right = word.find(")");
com.fi = word.substr(left+1,right - lbraq - 1);

1 个答案:

答案 0 :(得分:1)

您的格式化字符串是在不同的行上还是它们之间有一些统一的间距?如果是这样,您可以使用std::ifstream和C ++正则表达式库的组合,如下所示:

std::ifstream inf(...); // filename
const std::regex rgx("Par\\(\\w+\\)[0-9]{4}");
std::string read;
while (std::getline(inf, read)) {
    if (!std::regex_match(read, rgx)) { /* error handling here */ }
}

双反斜杠阻止编译器将转义的正则表达式字符作为实际转义字符读取,而w表示单词和字母等单词,而plus表示匹配一个或多个单词字符。其中包含范围的括号是捕获组,它捕获您在其中指定的某些字符,在本例中为任何数字字符。捕获组后面的花括号在其中指定了我们想要匹配的组的数量,在这种情况下是四个字符。我转义了括号,因为它们对正则表达式匹配很重要。

如果我在这里使用的格式与你的格式不符,那么C ++使用的regex语法很大程度上基于JavaScript,并且有几个站点可以用来测试JavaScript正则表达式,比如regex101.com。