【问题标题】:LeetCode 65: Valid Number (C++)LeetCode 65:有效数字(C++)
【发布时间】:2020-02-13 11:26:08
【问题描述】:

我想在if 语句中将input_string 向左/向右修剪,然后将其传递给regex_match,我尝试boost trim_right and 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.

【问题讨论】:

  • 在有趣的模式之前和之后允许空格,regex expression_two(R"aw(^ *([+-]?(?:[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]+) *$)aw");
  • 不客气。内森对修剪的回答很准确,对另一个问题的交叉引用也是如此。我使用 Boost,但有些人发现 Boost 有点太大(或令人生畏?),无法在他们的项目中使用它。

标签: c++ string algorithm boost


【解决方案1】:

最大的问题是std::regex_match 需要一个持久的字符串对象来引用结果。如果您没有,那么在检查结果之后将访问一个不存在的字符串,这是未定义的行为。这意味着您需要修改循环以使用 trim_copy from What's the best way to trim std::string? like

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;
}

改为。

【讨论】:

  • @Emma 只需将您的 for 循环更改为我在答案中的第一个循环,然后从 here 复制修剪功能。你可以看到它正在运行here
猜你喜欢
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-12
  • 2022-11-05
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多