解析带有定界符空格的字符串,但字符串也包含空格吗?

时间:2019-07-17 15:02:52

标签: c++ getline

我有一个文本文件,其中包含状态名称及其各自的缩写。看起来像这样:

Florida FL
Nevada      NV
New York     NY

因此,州名和缩写之间的空格数不同。我想提取名称和缩写,我考虑过使用带空白的getline作为定界符,但在“纽约”这样的名称中存在空白问题。我可以改用什么功能?

2 个答案:

答案 0 :(得分:1)

您知道缩写总是两个字符。

因此,您可以read the whole line,并将其从末尾拆分为两个字符(可能使用substr)。

然后trim第一个字符串,您将使用两个漂亮的字符串作为名称和缩写。

答案 1 :(得分:0)

系统的方法是分析所有可能的输入数据,然后在文本中搜索模式。在您的情况下,我们会分析问题并找出原因

  • 在字符串末尾,我们有一些连续的大写字母
  • 在获得州名之前

因此,如果我们搜索状态缩写模式并将其拆分,则状态的全名将可用。但也许有前后空格。我们将删除它,然后结果在那里。

对于搜索,我们将使用std::regex。模式是:1个或多个大写字母,后跟0个或多个空格,然后是行尾。正则表达式为:"([A-Z]+)\\s*$"

如果可用,结果的前缀将包含完整的状态名称。我们将删除开头和结尾的空格。

请参阅:

#include <iostream>
#include <string>
#include <sstream>
#include <regex>

std::istringstream textFile(R"(   Florida FL
  Nevada      NV
New York     NY)");

std::regex regexStateAbbreviation("([A-Z]+)\\s*$");

int main()
{
    // Split of some parts
    std::smatch stateAbbreviationMatch{};
    std::string line{};

    while (std::getline(textFile, line)) {
        if (std::regex_search(line, stateAbbreviationMatch, regexStateAbbreviation))
        {
            // Get the state
            std::string state(stateAbbreviationMatch.prefix());
            // Remove leading and trailing spaces
            state = std::regex_replace(state, std::regex("^ +| +$|( ) +"), "$1");

            // Get the state abbreviation
            std::string stateabbreviation(stateAbbreviationMatch[0]);

            // Print Result
            std::cout << stateabbreviation << ' ' << state << '\n';
        }
    }
    return 0;
}