LeetCode 65: действительный номер (C ++) - PullRequest
0 голосов
/ 16 октября 2019

Я бы хотел обрезать влево / вправо input_string перед тем, как передать его в regex_match в операторе if, и я безуспешно пробовал boost trim_right и trim_left, но не знаете, как ее решить.

Как мне просто обрезать входы, чтобы первые два входа " 0 " и " 0.1 " стали действительными числами?

#include <string>
#include <boost/algorithm/string.hpp>

#include <iostream>
#include <regex>
#include <vector>
using namespace std;

int main() {
    vector<string> string_vector = {"   0  ","   0.1   ","abc","1 a","2e10","-90e3","1e","e3","6e-1","99e2.5","53.5e93","--6","-+3","95a54e53"};

    regex expression_two("^[+-]?(?:[0-9]*\\.[0-9]+|[0-9]+\\.[0-9]*|[0-9]+)[Ee][+-]?[0-9]+$|^[+-]?(?:[0-9]*\\.[0-9]+|[0-9]+\\.[0-9]*|[0-9]+)$|^[+-]?[0-9]+$");

    for (const auto &input_string: string_vector) {
        if (std::regex_match(input_string, expression_two))
            cout << "[0-9] Char Class: '" << input_string << "' is a valid number." << endl;
    }
    return 0;
}

ТекущийВыход

[0-9] Char Class: '2e10' is a valid number.
[0-9] Char Class: '-90e3' is a valid number.
[0-9] Char Class: '6e-1' is a valid number.
[0-9] Char Class: '53.5e93' is a valid number.

Желаемый выход

[0-9] Char Class: '  0  ' is a valid number.
[0-9] Char Class: '  0.1  ' is a valid number.
[0-9] Char Class: '2e10' is a valid number.
[0-9] Char Class: '-90e3' is a valid number.
[0-9] Char Class: '6e-1' is a valid number.
[0-9] Char Class: '53.5e93' is a valid number.

1 Ответ

1 голос
/ 16 октября 2019

Самая большая проблема заключается в том, что std::regex_match нужен объект с персистентной строкой для ссылок на результаты. Если у вас этого нет, то после проверки результатов вы получите доступ к несуществующей строке с неопределенным поведением. Это означает, что вам нужно изменить цикл так, чтобы он использовал trim_copy из Какой лучший способ обрезать std :: string? как

for (const auto &input_string: string_vector) {
    auto trimmed = trim_copy(input_string);
    if (std::regex_match(trimmed, expression_two))
        cout << "[0-9] Char Class: '" << input_string << "' is a valid number." << endl;
}

Это будет стоить вам копию,но это единственный способ сделать это без изменения исходных данных. Если вы можете изменить исходные данные, вы можете использовать

for (auto &input_string: string_vector) {
    if (std::regex_match(trim(input_string), expression_two))
        cout << "[0-9] Char Class: '" << input_string << "' is a valid number." << endl;
}

.

...